当应用程序停用时如何关闭BackgroundWorker线程?

2023-11-29

我创建线程BackgroundWorker,并且在循环中我每次都会检查是否CancellationPending是真是假,就像这样:

   public MainPage()
    {
        InitializeComponent();

        bw = new BackgroundWorker();
        bw.WorkerReportsProgress = true;
        bw.WorkerSupportsCancellation = true;
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    }

    private void ButtonStart_Click(object sender, RoutedEventArgs e)
    {
        if (bw.IsBusy != true)
        {
            bw.RunWorkerAsync();
        }
    }

    private void ButtonCancel_Click(object sender, RoutedEventArgs e)
    {
        if (bw.WorkerSupportsCancellation)
        {
            bw.CancelAsync();
        }
    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 1; i <= 100; i++)
        {
            Debug.WriteLine("The tread is working");
            if (worker.CancellationPending)
            {
                e.Cancel = true;
                bw.CancelAsync();
                break;
            }
            else
            {

                System.Threading.Thread.Sleep(500);
                worker.ReportProgress(i);
            }
        }
    }

    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Cancelled)
        {
            tbProgress.Text = "Canceled";
        }
        else if (e.Error != null)
        {
            tbProgress.Text = "Error: " + e.Error.Message;
        }
        else
        {
            tbProgress.Text = "Done";
        } 
    }

    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        tbProgress.Text = e.ProgressPercentage.ToString() + "%";
    }

当应用程序停用时,线程没有关闭,而是中止并发生异常。线程的关闭程度如何BackgroundWorker应用程序何时停用?


当应用程序停用时,除主 UI 线程之外的每个线程一旦变为活动状态都会抛出 ThreadAbortException。这似乎是“有意为之”的,旨在迫使应用程序快速停止正在执行的操作。线程可以捕获 ThreadAbortException 并结束它们正在执行的操作,但请注意,ThreadAbortException 将在 catch 块末尾再次自动引发。 finally 块中的任何代码也将被执行。

对于您的具体问题,没有理由在应用程序停用时尝试取消BackgroundWorker,因为将会发生ThreadAbortException并且将有效地停止后台工作程序。如果你想在发生这种情况时做一些清理工作,你可以在 bw_DoWork 中捕获 ThreadAbortException,做你需要做的事情,然后让它消亡。

要在激活后重新启动它,您必须重新启动后台工作程序,就像应用程序第一次运行时一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当应用程序停用时如何关闭BackgroundWorker线程? 的相关文章

随机推荐

  • NHibernate 删除 DAL?

    使用 NHibernate 或任何其他 ORM 消除了 DAL 的必要性 我说得对吗 或不 我试图思考如何回答这个问题 但答案是否定的 它不会消除 DAL 的必要性 而不是成为该 DAL 的一部分 毫无疑问 您之前所做的就是访问调用 sql
  • Spring @Bean 与 @Lookup 方法

    我已经利用 Lookup 注释实现了一个 Spring bean 该线程很有帮助 如何使用spring Lookup注解 随后我注意到一种奇怪的行为 我不确定是有意为之还是我自己的误解 Spring 将在使用 Service Compone
  • Android 中的图像内存管理

    这是初学者最常问的问题之一 但不幸的是我仍然无法得到任何帮助 在一个活动中 我有一个 viewflipper 我以编程方式将图像视图分配给它 使用 for 循环将大约 100 个图像添加到 viewflipper 可能是由于图像大小或由于图
  • 基于 redshift 中的自表查找更新表

    我有下表 id email mgr email mgr id 1 email1 email2 2 email2 email3 3 email3 email4 我想通过将 mgr email 与电子邮件匹配来填充 id 列中的 mgr id
  • Android OutOfMemoryError 大图像

    对于尺寸较大的图像 不是按分辨率 该方法会抛出 OutOfMemoryError 我有 12 MP 照片 所有照片的大小都不同 1 5MB 2 5MB 3 2MB 4 1MB 等 所有照片的分辨率都是相同的 4000 x 3000 像素 r
  • 当传递给另一个对象时,谁应该对 IDisposable 对象调用 Dispose?

    是否有关于谁应该致电的指导或最佳实践Dispose 当一次性对象被传递到另一个对象的方法或构造函数时 这里有几个例子来说明我的意思 IDisposable 对象被传递到一个方法中 完成后是否应该释放它 public void DoStuff
  • 使用 AWK 打印 XML 元素

    如何使用 AWK 打印 XML 元素的内容 从开始标记到结束标记 例如 考虑以下 XML
  • 追溯性地向方法添加Java注释?

    有没有办法修改 class 文件以便向某些方法添加 Java 注释 基本上我想遍历 jar 文件中每个类文件的方法并注释某些方法 请注意 这不是在使用 jar 文件时的运行时 相反 完成后我想用注释修改类文件 我确实可以访问源代码 所以如果
  • 测试 JButton 时,我的 lambda 表达式有效,但 actionPerformed 无效

    我正在按照以下步骤第一次学习如何使用 Java Swingtutorial在YouTube上 我已经到达涵盖按钮的部分 并且一直按照代码进行操作 但是 在尝试测试按钮时 当我使用actionPerformed方法 我的按钮不会打印出这个词
  • Ruby on Rails:将 javascript 数据发送到 ruby​​ 控制器

    我想发送一个 javascript 数组以由我的控制器中的方法处理 我认为我这样做是错误的 我是一个彻底的 RoR jquery 和 ajax 菜鸟 这是我所拥有的 请给我一些指导 div class dataTable style wid
  • HTML5画布的大小和分辨率有什么关系

    有没有一种方法可以创建大尺寸但低分辨率的画布 我用语法声明画布
  • Android:fastScrollEnabled 起初不起作用

    OK I am working on an App that has a page with a listview and a edittext box at top As you type things into the edittext
  • 通过字符串名称动态实例化子组件 - ReactJs

    我有一个包含 React 组件字符串名称的数组 SampleWidget1 它由外部机制填充 在我的 DashboardInterface 组件中 我想使用该数组 渲染其中包含的组件 并将其显示在 DashboardInterface re
  • 分段错误 11 链接 os x 32 位汇编器

    更新 果然 这是最新版本的 nasm 中的一个错误 我 降级 并按照我接受的答案所示修复我的代码后 一切正常 感谢大家 我在 OS X 上的 32 位汇编程序中遇到了一个非常简单的程序的问题 首先 代码 section data hello
  • 未获取所需的 SOAP 请求 XML

    我正在开发一个使用 OCPP 开放充电点协议 的简单 php 客户端 我已经创建了客户端 这是来自我的代码的请求 XML
  • nodejs将gridFS中存储的图像显示为html

    嗨 我是 Nodejs 和 gridFS 的新手 我正在尝试将 gridFS 中存储的图像显示到我的 html 页面 目前 我正在使用这段代码 gfs exist options function err found if err retu
  • 返回一个空的 Observable

    功能more 应该返回一个Observable来自获取请求 export class Collection public more Observable
  • 如何将 QLineEdit 中的文本居中? [复制]

    这个问题在这里已经有答案了 我搜索过但找不到将 QLineEdit 内的文本居中对齐的解决方案 Example https i stack imgur com eps2z png 对齐 Qt 对齐 该属性保存行编辑的对齐方式 这里允许水平和
  • 带 *args 和 **kwargs 的默认参数

    In Python 2 x 我使用 2 7 这是使用默认参数的正确方法 args and kwargs 我发现了一个与该主题相关的问题 但那是为了Python 3 使用 args kwargs 和可选 默认参数调用 Python 函数 在那
  • 当应用程序停用时如何关闭BackgroundWorker线程?

    我创建线程BackgroundWorker 并且在循环中我每次都会检查是否CancellationPending是真是假 就像这样 public MainPage InitializeComponent bw new BackgroundW