优雅处理窗体关闭时的后台工作线程
当窗体初始化一个后台工作线程 (BackgroundWorker) 时,在窗体关闭时正确处理其取消至关重要。否则,可能会导致异常或死锁。
问题描述
一个窗体实例化一个 BackgroundWorker,并在主线程上更新其文本框。当窗体的 Closing 事件触发时,简单地取消 BackgroundWorker 会在 Invoke() 调用上引发 ObjectDisposedException 异常。相反,在 Closing 事件中等待 BackgroundWorker 完成会导致死锁,因为 Invoke() 操作被阻塞。
解决方案
为了解决这个问题,如果 BackgroundWorker 仍在运行,则必须取消 FormClosing 事件。这可以通过以下步骤实现:
然后,BackgroundWorker 的 RunWorkerCompleted 事件处理程序可以检查 closePending 标志,并在必要时调用 Close()。
以下是一个示例实现:
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; // 其他操作... }
通过这种方法,可以关闭窗体而不会导致异常或死锁,从而确保 BackgroundWorker 的优雅关闭。
以上是当形式关闭时,如何优雅地关闭背景工作者?的详细内容。更多信息请关注PHP中文网其他相关文章!