2011-05-24 60 views
3

我對c sharp很陌生。 我創建了一個Windows窗體應用程序。 我的應用程序工作正常。 我想在運行時取消BackgroundWorker。我的意思是我想完全停止BackgroundWorker過程。 我使用此代碼取消申請, 1)首先我用如何在運行時停止背景工作

private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
    { 

     this.Dispose(); 
    } 

但它亙古不變的停止。然後我用

private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     bgBackfill1.CancelAsync(); 
     this.Dispose(); 
    } 

但是,當我退出應用程序它將文件寫入G:\ Drive。 任何人都可以請我說我如何停止在G:\ Drive中寫入文件並完全停止BackgroundWorker過程。

謝謝如果有人幫助我。

回答

5

背景工作者的工作方法必須知道有取消掛起,所以只有這樣它才能取消。

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 

    for (int i = 1; (i <= 10); i++) 
    { 
     if ((worker.CancellationPending == true)) 
     { 
      e.Cancel = true; 
      break; 
     } 
     else 
     { 
      // Perform a time consuming operation and report progress. 
      System.Threading.Thread.Sleep(500); 
      worker.ReportProgress((i * 10)); 
     } 
    } 
} 

因此,當您設置CancelAsync時,您將取消掛起。但是您還需要在DoWork方法中注意該屬性 - 儘快取消作業。請參閱樣本MSDN

1

您的Backgroundworker必須被編程爲可取消。首先將工人取消:

var bg= new BackgroundWorker(); 
bg.WorkerSupportsCancellation = true; 

然後在你的工人迴路檢查BackgroundWorker類的CancellationPending標誌看時,你應該退出循環。

1

您必須在初始化BackgroundWorker組件時以及在致電RunWorkerAsync之前設置WorkerSupportsCancellation屬性。因此,舉例來說:

MyWorker = new BackgroundWorker(); 
MyWorker.WorkerSupportsCancellation = true; 
MyWorker.WorkerReportsProgress = true; 
MyWorker.DoWork += DoWorkEventHandler; 
MyWorker.ProgressChanged += WorkerProgressChanged; 
MyWorker.RunWorkerAsync(); 
3

在你的「DoWork的」生活習慣,你可以檢查工作線程(讓我們稱之爲它worker1)與worker1.CancellationPending,如果屬實,那麼它試圖取消,如果您在你的迭代代碼中測試它,並且明顯地停止繼續處理,並且在最後設置e.Cancel = true,你將成功地檢查和處理取消你的後臺工作者。

+0

當我添加e.cancel它的說法設置你缺少的程序集引用可以說我什麼是我需要添加在wfa中的引用 – 2011-05-24 07:05:45

+0

如果你看看VikciaR的帖子,DoWorkEventArgs包含一個.Cancel,使用將是System.ComponentModel – BugFinder 2011-05-24 07:23:20