- BackgroudWorkerクラスでは、以下のイベントにメインスレッド側クラスのメソッドを登録することで、ワーカスレッドでのイベント発生を知ることができる。
- ProgressChanged:実行状態の更新
- RunWorkerCompleted:実行の終了
- ワーカスレッド側でProgressChangedイベントを発生させるには、BackgroundWorker.ReportProgress()メソッドを呼べばよい。
- RunWorkerCompletedイベントは、ワーカスレッドが終了すれば勝手に発生する。
- CancellationPendingプロパティを使用すると、ワーカスレッドの中断を実現できる。(でも、ワーカスレッド側でCancellationPendingプロパティの定期的なチェック処理を書かねばならず、少しショボい気がする)
…
private void BW_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
// イベントを送信してきたインスタンスを取得
BackgroundWorker wtBW = (BackgroundWorker)sender;
while (true)
{
++gCount;
// ★☆ProgressChangedイベントを発生させ、登録されているメソッドを発生させる
wtBW.ReportProgress(0);
Thread.Sleep(500);
// ★☆CancellationPendingをチェックして、trueだったらワーカスレッドを終了させる
if (wtBW.CancellationPending)
{
return;
}
}
}
…
- スレッド間での値の受け渡しは、BackgroundWorkerクラスと同様にイベントを使用するのがよさそう。
- 同じクラス内の別スレッドの場合は、共通フィールドを使うしかない。
最終更新:2009年10月24日 13:17