2011-09-19 78 views
3

我有一個使用BackgroundWorker組件的示例WinForms應用程序。它工作正常,但當我點擊Cancel按鈕取消後臺線程它不會取消線程。當我按下Cancel按鈕來調用.CancelAsync()方法時,則在RunWorkerCompleted事件處理程序e.Cancelled屬性始終保持爲false。我想當我點擊Cancel按鈕時,它應該設置爲true。C#,後臺工作人員

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 1; i <= 100; i++) 
    { 
     // Wait 100 milliseconds. 
     Thread.Sleep(100); 
     // Report progress. 
     if (backgroundWorker1.CancellationPending == true) 
     { 
      //label1.Text = "Cancelled by user."; 
      break; 
     } 

     backgroundWorker1.ReportProgress(i); 
    } 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    // Change the value of the ProgressBar to the BackgroundWorker progress. 
    progressBar1.Value = e.ProgressPercentage; 
    // Set the text. 
    label1.Text = e.ProgressPercentage.ToString(); 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled == true) 
    { 
     label1.Text = "Canceled!"; 
    } 
    else if (e.Error != null) 
    { 
     label1.Text = "Error: " + e.Error.Message; 
    } 
    else 
    { 
     label1.Text = "Done!"; 
    } 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    if (backgroundWorker1.WorkerSupportsCancellation == true) 
    { 
     // Cancel the asynchronous operation. 
     backgroundWorker1.CancelAsync(); 
    } 
} 

回答

7

取消的財產,因爲你跳出循環,然後允許的BackgroundWorker的DoWork的功能,以正常的方式結束仍然是假的。你永遠不會告訴你的背景工作者組件,這個未決的取消事實上已被接受。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 1; i <= 100; i++) 
    { 
     // Wait 100 milliseconds. 
     Thread.Sleep(100); 

     if (backgroundWorker1.CancellationPending) 
     { 
      e.Cancel = true; 
      break; 
     } 

     // Report progress. 
     backgroundWorker1.ReportProgress(i); 
    } 
} 

的區別非常重要,因爲有時你可能想你已經做了回滾工作,當你檢測CancellationPending請求,所以它可能是前一段時間,你實際上取消完成。