【问题标题】:C# Backgroundworker closing formC# Backgroundworker 关闭表单
【发布时间】:2014-10-06 15:36:34
【问题描述】:

我遇到了后台工作人员的问题。 当我取消后台工作人员时,它也会关闭表单,我不想要它。 我只想停止后台工作程序,并将表单保留在屏幕上,并向用户说一条消息,例如“程序已被用户停止”

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”按钮时,它应该向我的 BWorker 发送一个 CancelSignal。 每次我的 BWorker 工作时,我都会在做任何事情之前检查这个 CancellationPending 信号。

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

【问题讨论】:

  • 如果您在 if((worker.CancelationPending == true)) 行上放置一个断点,在您单击取消后是否显示为 true?会不会是因为完成的工作太长了,以至于您愿意等待完成这项检查所需的时间更长?

标签: c# asynchronous backgroundworker cancellation


【解决方案1】:

当您将 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
    }

}

【讨论】:

    【解决方案2】:

    你没有正确处理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

    【讨论】:

    • 是的,你是对的。我删除了 dispose 以保留表单,删除了 CancelAsyn() 并让休息;我也移动了我的 if 因为它不在正确的位置。它现在正在工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2023-03-18
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多