C#后台工作人员结账表

C#后台工作人员结账表,c#,asynchronous,backgroundworker,cancellation,C#,Asynchronous,Backgroundworker,Cancellation,我和一个背景工作者有问题。 当我取消backgroundworker时,它也会关闭表单,我不想要它。 我只想停止backgroundworker,并将表单保留在屏幕上,并向用户发送一条消息,如“程序被用户停止” public BackgroundWorker bw=new BackgroundWorker(){WorkerSupportsCancellation=true}; 公共表格1() { bw.workersupport扫描单元=真; 初始化组件(); } 私有void stopChil

我和一个背景工作者有问题。 当我取消backgroundworker时,它也会关闭表单,我不想要它。 我只想停止backgroundworker,并将表单保留在屏幕上,并向用户发送一条消息,如“程序被用户停止”

public BackgroundWorker bw=new BackgroundWorker(){WorkerSupportsCancellation=true};
公共表格1()
{
bw.workersupport扫描单元=真;
初始化组件();
}
私有void stopChild\u单击(对象发送方,事件参数e)
{
如果(bw.IsBusy)
{
CancelAsync();
这个。Dispose();
}
}
公共无效startParListe()
{
bw.DoWork+=新DoWorkEventHandler(bw_DoWork);
如果(bw.IsBusy!=真)
RunWorkerAsync();
}
公共无效bw_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
for(int i=0;i
因此,当用户单击“stopChild”按钮时,它应该向我的BWorker发送一个取消信号。 每次我的BWorker工作时,我都会在做任何事情之前检查这个CancellationPending信号

使用此代码,当单击“stopChild”时,表单关闭
当我删除“this.Dispose()”时,BWorker不会停止。为什么?

当您将e.Cancel设置为true时,应该中断循环(此外,此.Dispose()正在关闭表单:

public void bw_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker ;
    for (int i = 0; i < countPlages; i++)
    {
         if ((worker.CancellationPending == true)) 
         {
             e.Cancel = true;
             break;
         }
         #do something else
    }
public void bw\u DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
for(int i=0;i

}您没有正确处理
取消挂起

     if ((worker.CancellationPending == true)) 
     {
         e.Cancel = true;
     }
我不确定
e.Cancel
应该做什么,但您仍然在for循环中继续工作,因为您没有离开循环。将其更改为:

     if (worker.CancellationPending) // btw - avoid unnecessarily verbous code
     {
         break;
     }

backgroundworker不会关闭您的表单,
this.Dispose
会关闭。您需要忽略它。之所以
this.Dispose
帮助停止后台工作程序,是因为它属于表单,因此关闭表单也会关闭工作程序。但是,一旦您按照上述方法修复了取消操作,您就不需要
Dispose
如果在if((worker.CancelationPending==true))行上放置断点,单击“取消”后是否会显示为true?是否是因为完成的工作太长,花费的时间超过了您等待检查的时间?是的,您是对的。我删除了dispose以保留表单,删除了CancelAsyn()我也移动了我的if,因为它不在正确的位置。它现在正在工作。谢谢!
     if (worker.CancellationPending) // btw - avoid unnecessarily verbous code
     {
         break;
     }