1

obackgroundworker.CancelAsync(); を呼び出します。現在別のスレッドで何らかの作業を行っているバックグラウンド ワーカーで、アプリケーションを終了する前に while (obackgroundworker.IsBusy == true) を使用して終了するのを待ちます (スレッドが処理を行っていない間にユーザーが気が変わった場合に備えて)。きれいに閉じます)

保留中のキャンセルのフラットは正しく true に設定されていますが、スレッドは終了しません。ワーカー スレッドでは次のようになります。

backgroundworker obackgroundworker = (backgroundworker)sender;
if (obackgroundworker.cancellationpending == true)
     e.cancel = true;              

キャンセルが保留中かどうかを確認してから、キャンセルされたフラグをtrueに設定する必要があります。これにより、スレッドが実際に終了することもあると思います...? または、実際に終了するためにキャンセルが検出されたときに、スレッドから呼び出す必要がある他の関数がありますか?

上記とまったく同じようにバックグラウンドワーカーを使用する多くの例を読みましたが、問題は報告されていません。

ソース:

http://www.albahari.com/threading/part3.aspx http://www.dotneat.net/2009/02/10/BackgroundworkerExample.aspx http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads. aspx

ありがとう

4

2 に答える 2

9

true に設定e.Cancelしても の実行は停止しませんBackgroundWorker。操作がキャンセルされたことを示すだけなので、RunWorkerCompletedイベントで確認できます。DoWorkイベント ハンドラから戻ってタスクを停止する必要があります。

BackgroundWorker obackgroundworker = (BackgroundWorker)sender;
if (obackgroundworker.CancellationPending == true)
{
     e.Cancel = true;
     return;
}
于 2009-11-10T09:43:41.157 に答える
5

いいえ、プロパティを設定するだけではスレッドは終了しません。その時点でメソッドから戻る必要があります。たとえば、最初のリンクのコードは次のとおりです。

if (bw.CancellationPending) {
    e.Cancel = true;
    return;
}

メソッドが終了するように、return ステートメントに注意してください。

もちろん、スタックの奥深くにあるメソッドからこれを実行している場合は、呼び出し元も終了することを認識していることを確認する必要があります。CancellationPendingとにかくプロパティをチェックするので、通常は返すだけで問題ありません。

于 2009-11-10T09:41:38.090 に答える