C# backgroundWorke

本文介绍如何利用C#中的backgroundWorker来处理后台任务,避免阻塞主线程,提升应用响应速度和用户体验。重点阐述了RunWorkerAsync()、ReportProgress()和OnRunWorkerCompleted()方法的应用,以及如何在UI线程中更新状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天做个小东西时发现还是要用多线程,否则如计算时主界面就会卡死,这样用户体验就很不好。简单学习了下C#中的backgroundWorker,个人感觉和thread有点像。

简单说下自己用到的方法。时间有点紧,周末再重新理下。


RunWorkerAsync() :开始后台操作,可以理解为开始异步操作了,开始doWork事件,doWork事件里你要干的事

ReportProgress(Int32): 引发 ProgressChanged 事件。在涉及到异步线程中需要改变UI线程(我的理解是main线程)时,会无法实现,因为VS会提醒你这个控件不是你的,无法修改。这里我看到有人说用了这个就可以不用invoke了。例子在后面的example中有,不过我试了在我的东西里是不行的,之后周末的时候再确定一下。所以我遇到这个情况使用的还是invoke方法,如下

private void Update(DeltaImage delta)
        {
            if (PictureBox.InvokeRequired)
            {
               PictureBox.Invoke(new MethodInvoker(() => UpdateOnGuiThread(delta)));
            }
            else
            {
                UpdateOnGuiThread(delta);
            }
        }

关键部分已用红字标出,这是一个改变pictureBox的操作,类似的操作修改即可实现。


OnRunWorkerCompleted引发 RunWorkerCompleted 事件。

CancelAsync: 这个也是例子中的一个方法,我们需要做到可以随时打断线程,无论是UI线程还是子线程。这里,我们cancel之后,把e.CancellationPending = true; 即标记上事件已取消。


reference:

1)概念,定义,方法(全)

https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(v=vs.110).aspx

2)example

http://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值