Thread.CurrentThreadは、現在のスレッドオブジェクトを返すスタティックメソッド。
Thread.CurrentThread プロパティ (System.Threading) | Microsoft Docs
デリゲートとBeginInvokeなどを使った非同期処理において、UIスレッドとワーカースレッドが違うスレッドであることを確認するには、呼び出した時点でのCurrentThreadを取得して、ManagedThreadIdが違えば、スレッドが違うことがわかる。
Control.BeginInvokeで作ったプログラムをベースに、スレッドIDを確認していく。
Windowsアプリ。
Buttonを選択。
以前のより小さく配置。
フォントサイズは以前と同じ。
こんな感じ。
開始に変えておくか。
今度はLabelを追加。
フォントは少し大きく。
配置したら、
テキストを仮に"-"としておく。
小さいのでFormを引き延ばして巨大化して、Labelもコピーで縦に5個並べた。
button1をダブルクリックして、イベントハンドラなどいろんな処理を書く。
まずコンストラクタで、Thread.CurrentThread.ManagedThreadIdでスレッドIDを取得し、label1.Textにセット。
button1が押された時の非同期処理。
ここで、Thread.CurrentThread.ManagedThreadIdを呼んでるので、ワーカースレッドのIDが取得できる。
それを非同期処理メソッドのRunningが格納されたrunningとともに、label2.BeginInvokeの引数として渡している。
Runningで、渡されたスレッドIDをlabel2にセット。
RunningはUIスレッドなので、Thread.CurrentThread.ManagedThreadIdを呼べば、UIスレッドのIDが取得できるので、それをlabel3にセット。
Finishも同様。
StartじゃなくてAfterに変えてるぐらい。
Afterはメッセージボックスのみ。
起動時のUIスレッドIDはこちら。
開始を押すと、
RunningでのワーカースレッドIDは違うけど、UIスレッドIDは同じ。
Finishでも、ワーカースレッドは違い、UIスレッドは同じ。
ということで、ワーカースレッドIDとUIスレッドIDは違い、UIスレッドのデリゲートの中ならコントロールを操作できるのがわかった。
Sample/dotnet/Thread/CurrentThread/src/Thread_ at master · bg1bgst333/Sample · GitHub