優雅處理窗體關閉時的後台工作線程
當窗體初始化一個後台工作線程 (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中文網其他相關文章!