2014-03-28 46 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內部正在執行的操作,而不是強制停止它在的位置。

您可以使用全局變量來執行此操作。取消同步只是一個更乾淨的方式。

相關問題