首頁 >後端開發 >C++ >關閉Windows表單時,如何安全地停止背景工作者?

關閉Windows表單時,如何安全地停止背景工作者?

Barbara Streisand
Barbara Streisand原創
2025-01-31 17:06:12662瀏覽

How to Safely Stop a BackgroundWorker When Closing a Windows Form?

優雅地處理Windows窗體關閉時的後台工作線程

在Windows窗體中使用BackgroundWorker時,一個常見問題是在窗體關閉時停止工作線程。然而,在窗體關閉事件處理程序中簡單地調用bgWorker.CancelAsync()可能會導致異常或死鎖。

問題一:Invoke調用中的ObjectDisposedException異常

如果在窗體關閉事件處理程序中直接調用bgWorker.CancelAsync(),隨後的Invoke調用可能會拋出ObjectDisposedException異常。這是因為窗體正在被釋放,主線程已經退出。

問題二:bgWorker完成時的死鎖

在窗體關閉事件處理程序中等待bgWorker完成可能會導致死鎖,因為Invoke調用仍在進行中,阻止工作線程完成。

解決方法:協調窗體關閉和後台工作線程完成

為了解決這些問題,需要一種更穩健的方法:

  1. 在窗體關閉事件處理程序中,如果bgWorker仍在運行,則設置e.Cancel = true
  2. 設置一個標誌closePending,指示用戶請求關閉。
  3. bgWorkerRunWorkerCompleted事件處理程序中,檢查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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn