すがブロ

sugamasaoのhatenablogだよ

.NET Framework でのスレッド

スレッド問題

以前、Windowフォームの値を別スレッドで更新しようとするとエラーになるということを書いた(id:seiunsky:20061101:1162404086)。
で、解決策としてデリゲートを使うやり方をしたんだけど、実はもっとスマートな方法があった。
方法 : Windows フォーム コントロールのスレッド セーフな呼び出しを行う
http://msdn2.microsoft.com/ja-jp/library/ms171728(VS.80).aspx
Windows業務アプリケーション開発 Q&A #6 − @IT
http://www.atmarkit.co.jp/fdotnet/vblab/appqa_06/appqa_06_01.html
※下のリンクはVBだけど、基本的にはC#と変わらないので、何がやりたいかはわかると思う。

で、どうすれば良いのかと言うと

BackGroundWorkerを使う。フォーム上にドラッグ&ドロップで置いた後に、スレッドを生成したいイベントなりの場所で、

this.backgroundWorker1.RunWorkerAsync();

をコールする。
そうすると、BackgroundWorkerオブジェクトの名前_DoWorkのイベントが動く。
……ようするにDoWorkイベントが発行されるということだと思う。同じ要領で、スレッドが終了するとBackgroundWorkerオブジェクトの名前_RunWorkerCompleted()のイベントが呼ばれる。

というわけで

別スレッドにしたい箇所でRunWorkderAsync()メソッドを呼ぶ。
別スレッドで動作させたいロジックはDoWorkイベントに書く。
スレッドが終わったらWindowフォームへの描画処理をRunWorkerCompletedイベントに書く。
これでスレッドを経由した処理ができる。