これはドワークコードです。私もこれを乗り越えました。e.cancel = true の後、DoWork はもう一度実行され、while ループに到達し、e.Cancel を再度 true に設定して関数を終了し、Completed 関数を実行しません。
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
//While the song is not over
while (!worker.CancellationPending )
{
if (progressBar1.Value == progressBar1.Maximum)
{
e.Cancel = true;
return;
}
else
{
//Keep ticking the progress bar one second
worker.ReportProgress(0);
Thread.Sleep(1000);
}
}
e.Cancel = true;
return;
}
ワーカーをキャンセルするコードは次のとおりです。WaitOne() は、RunWorkerCompleted からシグナルを受け取るまでブロックします。
if (this.backgroundWorker2.IsBusy)
{
this.backgroundWorker2.CancelAsync();
_resetEvent.WaitOne();
}
編集:私はこのVVを行ったことに注意してください
backgroundWorker2.RunWorkerCompleted += backgroundWorker2_RunWorkerCompleted;
backgroundWorker2.WorkerSupportsCancellation = true;