バックグラウンドワーカーを完全に「強制終了」するにはどうすればいいですか? 質問する

バックグラウンドワーカーを完全に「強制終了」するにはどうすればいいですか? 質問する

一連のデジタル IO アクションを繰り返し実行する Windows アプリケーションを作成しています。

この一連のアクションは、ユーザーが「START」ボタンをクリックすると開始され、backgroundWorker1_DoWork() のバックグラウンド ワーカーによって実行されます。

ただし、「このバックグラウンドワーカーは現在ビジー状態です......」というエラー メッセージが表示される場合があります。

別のアクション シーケンスを開始する前に、while ループを使用してバックグラウンド ワーカーを「強制終了」することで、コードに次の内容を実装することを考えています。

if (backgroundWorker1.IsBusy == true)
{

    backgroundWorker1.CancelAsync();
    while (backgroundWorker1.IsBusy == true)
    {
        backgroundWorker1.CancelAsync();
    }

    backgroundWorker1.Dispose();

}

backgroundWorker1.RunWorkerAsync();

私の主な懸念は、backgroundWorker1 が最終的に「強制終了」されるかどうかです。そうなる場合、完了するまでに長い時間がかかりますか?

このコーディングによって無限ループに陥るのでしょうか?

ベストアンサー1

次のようなものを使用できます(管理対象スレッドの中止とThreadAbortExceptionの詳細については、「Rotor を使用して ThreadAbortException の深部を探る(Web アーカイブ)" (Chris Sells 著):

public class AbortableBackgroundWorker : BackgroundWorker
{

    private Thread workerThread;

    protected override void OnDoWork(DoWorkEventArgs e)
    {
        workerThread = Thread.CurrentThread;
        try
        {
            base.OnDoWork(e);
        }
        catch (ThreadAbortException)
        {
            e.Cancel = true; //We must set Cancel property to true!
            Thread.ResetAbort(); //Prevents ThreadAbortException propagation
        }
    }

 
    public void Abort()
    {
        if (workerThread != null)
        {
            workerThread.Abort();
            workerThread = null;
        }
    }
}

使用法:

backgroundWorker1 = new AbortableBackgroundWorker();
//...
backgroundWorker1.RunWorkerAsync();

if (backgroundWorker1.IsBusy == true)
{
    backgroundWorker1.Abort();
    backgroundWorker1.Dispose();
}

おすすめ記事