首頁 > 後端開發 > C++ > 當形式關閉時,如何優雅地關閉背景工作者?

當形式關閉時,如何優雅地關閉背景工作者?

Barbara Streisand
發布: 2025-01-31 16:56:10
原創
282 人瀏覽過

How to Gracefully Shut Down a BackgroundWorker When a Form Closes?

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

當窗體初始化一個後台工作線程 (BackgroundWorker) 時,在窗體關閉時正確處理其取消至關重要。否則,可能會導致異常或死鎖。

問題描述

一個窗體實例化一個 BackgroundWorker,並在主線程上更新其文本框。當窗體的 Closing 事件觸發時,簡單地取消 BackgroundWorker 會在 Invoke() 調用上引發 ObjectDisposedException 異常。相反,在 Closing 事件中等待 BackgroundWorker 完成會導致死鎖,因為 Invoke() 操作被阻塞。

解決方案

為了解決這個問題,如果 BackgroundWorker 仍在運行,則必須取消 FormClosing 事件。這可以通過以下步驟實現:

  • 在窗體中處理 OnFormClosing 事件。
  • 檢查 BackgroundWorker 是否繁忙,如果是,則取消它。
  • 設置一個標誌 (closePending) 來指示用戶請求關閉。

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板