[C#]プログラム中でApplication.Exit();を実行しても、プログラムが終了しない

プログラム中で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オブジェクトを調べる方法

関連記事

コメントを残す

メールアドレスが公開されることはありません。