Thread.CurrentThread

Thread.CurrentThreadは、現在のスレッドオブジェクトを返すスタティックメソッド。

Thread.CurrentThread プロパティ (System.Threading) | Microsoft Docs

デリゲートとBeginInvokeなどを使った非同期処理において、UIスレッドとワーカースレッドが違うスレッドであることを確認するには、呼び出した時点でのCurrentThreadを取得して、ManagedThreadIdが違えば、スレッドが違うことがわかる。
Control.BeginInvokeで作ったプログラムをベースに、スレッドIDを確認していく。

Windowsアプリ
Windowsアプリ

Windowsアプリ。

Buttonを選択
Buttonを選択

Buttonを選択。

以前のより小さく配置
以前のより小さく配置

以前のより小さく配置。

フォントサイズは以前と同じ
フォントサイズは以前と同じ

フォントサイズは以前と同じ。

こんな感じ
こんな感じ

こんな感じ。

開始に変えておくか
開始に変えておくか

開始に変えておくか。

今度はLabelを追加
今度はLabelを追加

今度はLabelを追加。

フォントは少し大きく
フォントは少し大きく

フォントは少し大きく。

配置したら
配置したら

配置したら、

テキストを仮に"-"としておく
テキストを仮に"-"としておく

テキストを仮に"-"としておく。

小さいのでFormを引き延ばして巨大化して、Labelもコピーで縦に5個並べた。
小さいのでFormを引き延ばして巨大化して、Labelもコピーで縦に5個並べた。

小さいので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
起動時のUIスレッドID

起動時のUIスレッドIDはこちら。
開始を押すと、

RunningでのワーカースレッドIDは違うけど、UIスレッドIDは同じ。
RunningでのワーカースレッドIDは違うけど、UIスレッドIDは同じ。

RunningでのワーカースレッドIDは違うけど、UIスレッドIDは同じ。

Finishでも、ワーカースレッドは違い、UIスレッドは同じ。
Finishでも、ワーカースレッドは違い、UIスレッドは同じ。

Finishでも、ワーカースレッドは違い、UIスレッドは同じ。

終わった
終わった

ということで、ワーカースレッドIDとUIスレッドIDは違い、UIスレッドのデリゲートの中ならコントロールを操作できるのがわかった。

Sample/dotnet/Thread/CurrentThread/src/Thread_ at master · bg1bgst333/Sample · GitHub