別の記事で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から登場したコンポーネントです。
これらを組み合わせれば基本的な処理はできると思います。