BeginInvokeとスレッド

.netのBeginInvokeにはデリゲート標準とコントロールの実装があるのでわかりずらいので整理

・delegateのBeginInvoke
BeginInvokeは非同期で実行する。登録できる関数は1個で2個以上だと例外が発生する。関数は別スレッドで実行される。

・ControlのBeginInvoke
ControlのBeginInvokeはWin32のPostMessageみたいなもので別スレッドでは実行しない。一般的にControlはそれを作ったスレッドしか触れないのでマルチスレッドで別スレッドからcontrolにアクセスするときは使う。PostMessageとは言っても引数を渡したり、あとで待ったりできるので高機能。

Form1.cs

Form2.cs

Class1.cs

form1は別スレッドでform2を作る。_f2にはform1のスレッドからは触れないのでBeginInvokeまたはInvokeを呼ぶことになる。関数はForm1にあってもいい。InvokeRequiredを使えば、Invokeが必要か判断できる。ただし多用すると、簡単にデッドロックになるだろう。このソースは本来form2を作るときもっと慎重にやらないとならないがスルーしてる。

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)