いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Windows Formsスレッド処理-001 (Windows Formsでのスレッド処理について)

別の記事でJavaのSwingにて、時間のかかる処理をどのようにして行うかを
書いていますが、ついでなのでWindows Formsについても勉強しようと思います。

少し前に、STAThreadについての日記を書いたのですが(http://d.hatena.ne.jp/gsf_zero1/20061120/p1)
要は、Windows FormsもJavaのSwingと同じくシングルスレッドポリシーだということになります。

Windows Formsの場合は、起動時にコントロールを作成した(newした)スレッドが、Javaでいう
Event Dispatch Threadになります。UIスレッドというらしいです。

てことは、SwingのinvokeLaterと同じように強制的にUIスレッドでコンポーネントの状態更新を行う事が
できるものがあるはずと思って、探すと、、ありました。

System.Windows.Forms.ControlのInvokeメソッド

このメソッドに引数として、delegate(引数が2つのものもあり)を渡すと
そのdelegateをUIスレッドにて実行してくれます。


また、Swingのスレッド処理にて記述しているSwingWorkerと同じようなコンポーネントも存在しています。

System.ComponentModel.BackgroundWorker

扱い方は、SwingWorkerとほとんど同じです。
非同期処理を行うためのDoWorkイベント、
進捗状況更新のためのProgressChangedイベント、
処理完了時のためのRunWorkerCompletedイベントがあります。


ちなみに、BackgroundWorkerは.Net Framework 2.0から登場したコンポーネントです。


これらを組み合わせれば基本的な処理はできると思います。

次は、JavaのSwing処理にて、作成したSwingアプリの動作をC#にて
実装してみます。