首页 > 后端开发 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板