一連のデジタル 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();
}