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)
{
//バックグラウンド終了処理
}
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)
{
Thread.Sleep(500);
}
で、以下の方法を試したところ、それらしく動作しました。
// スレッドの終了待ち
while (bw.IsBusy)
{
Application.DoEvents();
}
while (bw.IsBusy)
{
Application.DoEvents();
}
DoEventsの呼び出しはあまり好きではありません。出来れば使わない方法があるといいんですが。。。。
1 件のコメント:
MSDNのBackgroundWorker.IsBusy プロパティのサンプルコードもDoEvent呼び出してますね。
DoEventは時として弊害が出るのであまり使いたくありません。しかし、こういうものなのだろうか。。。
コメントを投稿