2

これはドワークコードです。私もこれを乗り越えました。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;
4

1 に答える 1

1

設定しましたか

BackgroundWorker.WorkerSupportsCancellation = true

?

于 2012-12-17T04:34:31.020 に答える