優雅關閉帶有活動 BackgroundWorker 的窗體
當窗體初始化一個更新窗體 UI 的 BackgroundWorker 時,關閉窗體而不遇到異常或死鎖可能會變得棘手。此問題突出了在窗體的 Closing 事件中嘗試停止 BackgroundWorker 時面臨的挑戰。
問題:
bgWorker.CancelAsync()
取消 BackgroundWorker 可能會在調用 Invoke()
時導致 ObjectDisposedException
。 Invoke()
不會返回。 解決方案:
避免死鎖和異常的安全方法是取消 FormClosing 事件本身。以下步驟概述了該解決方案:
closePending
標誌來跟踪用戶的關閉請求。 OnFormClosing
覆蓋中,檢查 BackgroundWorker 是否繁忙。 closePending
設置為 true,取消 BackgroundWorker,並通過設置 e.Cancel = true
來阻止窗體關閉。 RunWorkerCompleted
事件處理程序中,檢查是否設置了 closePending
。如果為 true,則關閉窗體。 closePending
標誌重置為 false。 示例代碼:
<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>
使用這種方法,即使 BackgroundWorker 正在積極更新 UI,也可以優雅地關閉窗體,而不會出現異常或死鎖。
以上是如何與活躍的背景工作者優雅地關閉表格?的詳細內容。更多資訊請關注PHP中文網其他相關文章!