后台工作人员在突然的程序结束时抛出异常

时间:2012-06-25 13:11:24

标签: c# .net-3.5 backgroundworker

我有一个非常基本的Windows窗体应用程序,在C#中工作,我正在尝试Background Worker。我在大多数情况下都遵循了该页面上的基本代码。

    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
            progressBar.Value = e.ProgressPercentage;
    }

一切都很好,除非后台工作人员在窗口关闭时正在工作(例如点击X)。上面的方法是抛出一个空引用异常(我在progressBar上假设?)。

我确实把它放在了关闭方法上:

    private void Form_FormClosing(object sender, FormClosingEventArgs e)
    {
        if(bgWorker.WorkerSupportsCancellation == true)
            bgWorker.CancelAsync();
    }

但是,这并没有解决问题。我想知道为什么会发生这种情况,我知道它与progressBar隔离,因为如果我删除该行,当它在窗口忙时关闭窗口时不会抛出任何异常。

1 个答案:

答案 0 :(得分:2)

是的,当您关闭Window时,包括ProgressBar在内的控件将被销毁。试图从Bgw访问它们而不检查将导致错误。

你可以像这样保护:

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   if ((progressBar == null) || progressBar.IsDisposed)
       return;

   progressBar.Value = e.ProgressPercentage;
}

同样取消Bgw也是一个好主意,但CancelAsync()本身是不够的。 DoWork()中的代码需要检查取消标记。