我有一个非常基本的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
隔离,因为如果我删除该行,当它在窗口忙时关闭窗口时不会抛出任何异常。
答案 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()
中的代码需要检查取消标记。