1

我有一个非常基本的 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,因为如果我删除该行,当我在忙时关闭窗口时不会引发异常。

4

1 回答 1

2

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

你可以这样保护:

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

   progressBar.Value = e.ProgressPercentage;
}

取消 Bgw 也是一个好主意,但仅靠CancelAsync()它是不够的。中的代码DoWork()需要检查取消标志。

于 2012-06-25T14:24:23.597 回答