在Windows窗体中使用BackgroundWorker时,一个常见问题是在窗体关闭时停止工作线程。然而,在窗体关闭事件处理程序中简单地调用bgWorker.CancelAsync()
可能会导致异常或死锁。
如果在窗体关闭事件处理程序中直接调用bgWorker.CancelAsync()
,随后的Invoke调用可能会抛出ObjectDisposedException
异常。这是因为窗体正在被释放,主线程已经退出。
在窗体关闭事件处理程序中等待bgWorker
完成可能会导致死锁,因为Invoke调用仍在进行中,阻止工作线程完成。
为了解决这些问题,需要一种更稳健的方法:
bgWorker
仍在运行,则设置e.Cancel = true
。closePending
,指示用户请求关闭。bgWorker
的RunWorkerCompleted
事件处理程序中,检查closePending
标志。如果已设置,则在窗体上调用Close()
。<code class="language-csharp">private bool closePending; protected override void OnFormClosing(FormClosingEventArgs e) { if (backgroundWorker1.IsBusy) { closePending = true; backgroundWorker1.CancelAsync(); e.Cancel = true; this.Enabled = false; // 或 this.Hide() return; } base.OnFormClosing(e); } void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (closePending) this.Close(); closePending = false; // 其他操作... }</code>
这种方法通过安全地处理窗体关闭事件和bgWorker
的完成来防止异常和死锁。
以上是关闭Windows表单时,如何安全地停止背景工作者?的详细内容。更多信息请关注PHP中文网其他相关文章!