2008年4月7日月曜日

[.NET]BackgroundWorkerの終了方法

.NET Framework2.0以降では、BackgroundWorkerというスレッド(並行処理)を簡単に扱うクラスが存在します。使い方はこんなかんじ。

BackgroundWorker bw = new System.ComponentModel.BackgroundWorker();
bw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.DoWork);
bw.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.RunWorkerCompleted);
bw.RunWorkerAsync();

private void DoWork(object sender, DoWorkEventArgs e)
{
     //バックグラウンド処理
}

private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
     //バックグラウンド終了処理
}


しかし、以下のようにスレッドの終了待ちうけをしていると、RunWorkerCompletedが呼ばれないのです。

// スレッドの終了待ち
while (bw.IsBusy)
{
     Thread.Sleep(500);
}


で、以下の方法を試したところ、それらしく動作しました。

// スレッドの終了待ち
while (bw.IsBusy)
{
     Application.DoEvents();
}


DoEventsの呼び出しはあまり好きではありません。出来れば使わない方法があるといいんですが。。。。

1 件のコメント:

GENZO さんのコメント...

MSDNのBackgroundWorker.IsBusy プロパティのサンプルコードもDoEvent呼び出してますね。
DoEventは時として弊害が出るのであまり使いたくありません。しかし、こういうものなのだろうか。。。