2014-03-28 45 views
1

我知道有很多关于体重指数的问题,但我仍然觉得有必要问这个问题/并不觉得我得到了我想要的信息......或者有人必须向我解释这个问题我可以理解的方式...我看到没有实际的目的打电话BW.CancelAsync(),除非它将CancellationPending标志设置为true ...BackgroundWorker为什么要调用CancelAsync()?

所以基本上,我的问题是:为什么在BW上拨打CancelAsync()

或者以不同的方式提出同样的问题:我的代码是以这种方式设置的,这是好的还是我应该在那里绝对叫CancelAsync()CancelAsync()服务该代码将无法处理的目的是什么?

这有点令人沮丧,但你总得到一个主意。

void BW_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Process_Status LastProcessed = Process_Status.None; 

    foreach(Iteration iter in Iterations) 
    { 
     //global form flag set when user presses CANCEL AND ROLLBACK button... 
     if (!this.IsRollBack) 
     { 
      try 
      { 
       //DO SOME WORK HERE 
       LastProcessed = Process_Status.SomethingSucceeded; 
      } 
      catch 
      { 
       this.LastFail = Process_Status.SomethingFailed; 
       //this, for me, cancels the thread and runs RunWorkerCompleted... 
       e.Cancel = true; 
      } 
     } 
     else 
     { 
      this.LastFail = LastProcessed; 
      //this, for me, cancels the thread and runs RunWorkerCompleted... 
      e.Cancel = true; 
     } 
    } 
} 

然后在RunWorkerCompleted ...

void BW_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled) 
    { 
     switch(this.LastFail) 
     { 
      //DO SOMETHING MEANINGFUL HERE BASED ON GLOBAL STATUS... 
     } 
    } 
} 

有人可以帮助我了解的CancelAsync()更好的目的是什么?

回答

1

它是用于取消按钮。如果您单击取消按钮,它会调用CancelAsync()。

在您的BackgroundWorker DoWork中,当您扫描E.Cancel = true时。如果您检测到E.Cancel为真,那么您可以通过受控方式停止Background工作程序中的代码。

这使您可以清理BackgroundWorker内部正在执行的操作,而不是强制停止它在的位置。

您可以使用全局变量来执行此操作。取消同步只是一个更干净的方式。

相关问题