马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
概念
在C#步调中,经常会有一些耗时较长的CPU麋集型运算,如果直接在 UI 线程实行如许的运算就会出现UI不相应的题目。办理这类题目的告急途径是利用多线程,启动一个背景线程,把运算利用放在这个背景线程中完成。但是原生接口的线程利用有一些难度,如果要更进一步的去完成线程间的通讯就会难上加难。
C#的BackgroundWorker类是一个用于简化在桌面应用步调(如Windows Forms或WPF)中实行背景使命的工具。它的告急目的是在不壅闭用户界面(UI)的环境下运行耗时利用,同时支持进度陈诉和使命取消。
告急作用
背景实行耗时使命
在单独的线程中运行长时间利用(如文件下载、数据处置惩罚),防止UI线程被壅闭,保持界面相应。
进度更新
答应在背景使命中陈诉进度(如更新进度条),并自动将更新利用同步到UI线程。
取消支持
提供机制让用户哀求取消正在实行的背景使命。
完成关照
在使命完成(乐成、取消或堕落)后,触发变乱以更新UI或处置惩罚结果。
关键成员
成员范例分析DoWork变乱背景使命逻辑:在此变乱处置惩罚步调中编写耗时利用代码。此代码在背景线程实行。ProgressChanged变乱进度更新:通过ReportProgress()方法触发,用于在UI上更新进度(如进度条)。RunWorkerCompleted变乱使命完成关照:在使命竣事时触发,处置惩罚结果或错误。RunWorkerAsync()方法启动背景使命。CancelAsync()方法哀求取消使命(需设置WorkerSupportsCancellation = true)。WorkerReportsProgress属性设置为true以启用进度陈诉功能。WorkerSupportsCancellation属性设置为true以答应使命取消。
典范利用场景
- // 创建BackgroundWorker实例
- var worker = new BackgroundWorker
- {
- WorkerReportsProgress = true,
- WorkerSupportsCancellation = true
- };
- // 订阅事件
- worker.DoWork += (sender, e) =>
- {
- for (int i = 0; i <= 100; i++)
- {
- if (worker.CancellationPending)
- {
- e.Cancel = true;
- return;
- }
- // 模拟耗时操作并报告进度
- worker.ReportProgress(i);
- Thread.Sleep(50);
- }
- };
- worker.ProgressChanged += (sender, e) =>
- {
- // 更新UI进度条(自动在UI线程执行)
- progressBar.Value = e.ProgressPercentage;
- };
- worker.RunWorkerCompleted += (sender, e) =>
- {
- if (e.Cancelled) MessageBox.Show("任务已取消!");
- else if (e.Error != null) MessageBox.Show($"错误:{e.Error.Message}");
- else MessageBox.Show("任务完成!");
- };
- // 启动任务
- worker.RunWorkerAsync();
复制代码
留意事项
- 跨线程访问UI
- DoWork变乱在背景线程运行,克制直接利用UI控件。
- ProgressChanged和RunWorkerCompleted变乱会自动在UI线程触发,可直接更新UI。
- 替换方案
当代C#更保举利用async/await共同Task.Run处置惩罚异步利用,代码更轻便。但BackgroundWorker仍实用于旧项目或必要深度集成进度/取消逻辑的场景。
与async/await对比
特性BackgroundWorkerasync/await + Task.Run复杂度基于变乱,代码分散线性布局,代码更清楚取消支持内置CancellationPending机制通过CancellationToken实现进度陈诉内置ReportProgress需自界说(如IProgress<T>接口)实用场景简朴背景使命复杂异步利用,需更高机动性 总结:BackgroundWorker是简化桌面应用背景使命处置惩罚的经典工具,得当必要快速实现进度更新和取消功能的场景。但在新项目中,可优先思量async/await以得到更当代的编程体验。
实例(源码)
- public partial class Form2 : Form
- {
- public BackgroundWorker worker = new BackgroundWorker();
- public Form2()
- {
- InitializeComponent();
- }
- private void Form2_Load(object sender, EventArgs e)
- {
- // Worker 工人
- // Reports 报告
- // Progress 进度
- // WorkeyRepoetsProgress 是否支持BackgroundWorker报告异步任务进度的功能。
- worker.WorkerReportsProgress = true;
- // WorkerSupportsCancellation 是否支持异步取消操作
- worker.WorkerSupportsCancellation = true;
- // 三个事件
- // 1 DoWork: 做异步耗时的操作(调用RunWorkerAsync方法之后触发)
- worker.DoWork += Worker_DoWork;
- // 2 ProgressChange 进度发生变化的事件,WorkerReportsProgress属性true的时候触发
- worker.ProgressChanged += Worker_ProgressChanged;
- // 3 RWorkerCompleted 后台操作完成的时候触发,取消或者异常的时候都会触发
- worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
- }
- //做异步任务的函数
- private void Worker_DoWork(object sender, DoWorkEventArgs e)
- {
- //模拟处理超时的操作
- Random rnd = new Random();
- for (int i = 0; i < 80; i++)
- {
- if (worker.CancellationPending) //判断用户是否取消了后台任务
- {
- e.Cancel = true; //取消后台任务
- return;
- }
- else
- {
- //耗时任务(文件读写,通讯、加载tb块)
- Thread.Sleep(rnd.Next(100, 1000)); //休眠100-1000ms之间,模拟耗时的
- //报告进度
- int progress = (int)Math.Round(((i + 1) / 80.0) * 100);
- progress = progress > 100 ? 100 : progress;
- worker.ReportProgress(progress);// 触发进度变化的事件
- }
- }
- }
- //加载进度的函数
- private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
- {
- progressBar1.Value = e.ProgressPercentage;// 把ReportProgress(progress)函数里面的参数传递过来,取出
- }
- //后台操作处理完的函数
- private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- this.BackColor = Color.Red;// 后台任务执行完之后的操作
- }
- //开始异步任务的按钮
- private void button1_Click(object sender, EventArgs e)
- {
- Console.WriteLine(worker.IsBusy);// backWrork是否是繁忙状态
- if (!worker.IsBusy) // 空闲状态下
- {
- worker.RunWorkerAsync();// 开始后台任务
- }
- }
- //取消异步任务的按钮
- private void button2_Click(object sender, EventArgs e)
- {
- if (worker.IsBusy) //非空闲状态下取消
- {
- worker.CancelAsync();//取消后台任务
- }
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |