在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中文網其他相關文章!