AndroidのrunOnUiThreadに相当するC#/ Windowsフォームはありますか?
たとえば、ワーカースレッドで(長時間実行)タスクを実行していて、最後に結果をGUIコントロールに投稿したいとします(もちろん、ワーカースレッドからは実行できません)。UIスレッドで処理するためにその更新表示を投稿できるrunOnUiThreadのような単純な関数はありますか?
AndroidのrunOnUiThreadに相当するC#/ Windowsフォームはありますか?
たとえば、ワーカースレッドで(長時間実行)タスクを実行していて、最後に結果をGUIコントロールに投稿したいとします(もちろん、ワーカースレッドからは実行できません)。UIスレッドで処理するためにその更新表示を投稿できるrunOnUiThreadのような単純な関数はありますか?
WinFormsの各コントロールは、メソッドInvoke
とBeginInvoke
メソッドを継承します。
Invokeはデリゲートを同期的に実行しますが、 BeginInvokeは非同期的に実行します。
これを行う一般的な方法は、System.Windows.Forms.Controlを使用することです。
control.BeginInvoke((MethodInvoker)delegate { ... });
ただし、コントロールのハンドルはUIスレッドですでに初期化されている必要があります。シンプルな
IntPtr ignored = control.Handle;
UIスレッドでそれを達成します。
Control.Invoke
メソッドを見てください。
MSDNから:「コントロールの基になるウィンドウハンドルを所有するスレッドで指定されたデリゲートを実行します。」
winformsコントロールまたはフォームにアクセスできる場合は、そのコントロールまたはフォームを呼び出すControl.Invoke
か、呼び出しControl.BeginInvoke
てください。