2011-05-24 63 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