c#后台工作人员关闭表单

本文关键字:表单 工作人员 后台 | 更新日期: 2023-09-27 18:17:43

我有一个后台工作人员的问题。当我取消后台工作者时,它也关闭了表单,我不想要它。我只是想停止后台工作者,并保持表单在屏幕上,并告诉用户一个消息,如"程序被用户停止"

public BackgroundWorker bw = new BackgroundWorker() { WorkerSupportsCancellation = true };
public Form1()
        {
            bw.WorkerSupportsCancellation = true;
            InitializeComponent();
        }
private void stopChild_Click(object sender, EventArgs e)
        {
            if (bw.IsBusy)
            {
                bw.CancelAsync();
                this.Dispose();
            }
        }
public void startParListe()
        {
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            if (bw.IsBusy != true)
                bw.RunWorkerAsync();
        }
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;
         }
         #do something else
    }
}
所以,当用户点击"stopChild"按钮时,它应该发送一个CancelSignal给我的BWorker。每次我的BWorker工作时,我在做任何事情之前都会检查这个CancellationPending信号。 使用这段代码,当点击"stopChild"时,窗体关闭。当我删除"this.Dispose() ", BWorker不停止。为什么?

c#后台工作人员关闭表单

您没有正确处理CancellationPending:

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

我不确定e.Cancel应该做什么,但你仍然继续在for循环中工作,因为你没有离开循环。改为:

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

后台工作人员不关闭你的形式,this.Dispose。你需要省略它。this.Dispose帮助停止后台worker的原因是因为它属于表单,所以关闭表单也关闭了worker。但是一旦你像上面描述的那样修复了取消,你就不需要Dispose

当你设置e.Cancel为true时,你应该跳出循环(同时,this.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
    }

}