プログラム中でApplication.Exit()を実行するとプログラムを終了させる事が可能です。
ですが、以下の場合はプログラムを終了させる事ができません。
BackgroundWorkerを使用している場合 かつ 指定されたタスクが未完了の場合 |
これは、プログラムのイベントループがBackgroundWorkerの終了待ち状態となり、結果としてプログラムが終了できない事が原因です。
※勿論、BackgroundWorkerのDoWork()イベントが終了すれば、プログラムは終了します。
上記の状態を避けるには、Application.Exit()を呼ぶ前にBackgroundWorkerのCancelAsyncをコールし、実行中のタスクをキャンセルしてあげる必要があります。
もちろん、呼び出されたBackgroundWorker側では、キャンセル処理に対応できている必要が有ります。
BackgroundWorkerをキャンセル処理に対応するためには、以下の3点を実装する必要があります。
1.WorkerSupportsCancellationプロパティをtrueにしておく
これはプロパティを変更するだけなので簡単です。
2.DoWorkイベント内で、CancellationPendingをチェックする
以下のような感じで、CancellationPendingを定期的にチェックし値がtrueならバックグラウンド処理を速やかに終了させます。void worker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender ; while ( true ) { if ( worker.CancellationPending ) { // キャンセル要求があれば、速やかに処理を終わらせる return; } //...バックグラウンドで行う処理 } } |
3.プログラムを終了させる際にCancelAsync();をコールする
CancelAsync()をコールしバックグラウンド処理側にキャンセル要求を投げます。このメソッドを呼ぶ事で、前述のCancellationPendingがtrueになります。
worker1.CancelAsync(); Application.Exit(); |
関連記事:未停止のbackgroundWorkerオブジェクトを調べる方法
関連記事
コメントを残す