首頁 >後端開發 >C++ >如何與活躍的背景工作者優雅地關閉表格?

如何與活躍的背景工作者優雅地關閉表格?

Patricia Arquette
Patricia Arquette原創
2025-01-31 17:01:10798瀏覽

How to Gracefully Close a Form with an Active BackgroundWorker?

優雅關閉帶有活動 BackgroundWorker 的窗體

當窗體初始化一個更新窗體 UI 的 BackgroundWorker 時,關閉窗體而不遇到異常或死鎖可能會變得棘手。此問題突出了在窗體的 Closing 事件中嘗試停止 BackgroundWorker 時面臨的挑戰。

問題:

  1. 在 HandleClosingEvent 中使用 bgWorker.CancelAsync() 取消 BackgroundWorker 可能會在調用 Invoke() 時導致 ObjectDisposedException
  2. 在 HandleClosingEvent 中等待 BackgroundWorker 完成會導致死鎖,因為 Invoke() 不會返回。

解決方案:

避免死鎖和異常的安全方法是取消 FormClosing 事件本身。以下步驟概述了該解決方案:

  1. 定義一個 closePending 標誌來跟踪用戶的關閉請求。
  2. OnFormClosing 覆蓋中,檢查 BackgroundWorker 是否繁忙。
  3. 如果繁忙,則將 closePending 設置為 true,取消 BackgroundWorker,並通過設置 e.Cancel = true 來阻止窗體關閉。
  4. 在 BackgroundWorker 的 RunWorkerCompleted 事件處理程序中,檢查是否設置了 closePending。如果為 true,則關閉窗體。
  5. 關閉操作後,將 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中文網其他相關文章!

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