C# backgroundworker类(背景线程)

[复制链接]
发表于 2025-10-17 21:55:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
概念

在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以答应使命取消。
典范利用场景


  1. // 创建BackgroundWorker实例
  2. var worker = new BackgroundWorker 
  3.     WorkerReportsProgress = true,
  4.     WorkerSupportsCancellation = true 
  5. };
  6. // 订阅事件
  7. worker.DoWork += (sender, e) => 
  8. {
  9.     for (int i = 0; i <= 100; i++) 
  10.     {
  11.         if (worker.CancellationPending) 
  12.         {
  13.             e.Cancel = true;
  14.             return;
  15.         }
  16.         // 模拟耗时操作并报告进度
  17.         worker.ReportProgress(i);
  18.         Thread.Sleep(50);
  19.     }
  20. };
  21. worker.ProgressChanged += (sender, e) => 
  22. {
  23.     // 更新UI进度条(自动在UI线程执行)
  24.     progressBar.Value = e.ProgressPercentage;
  25. };
  26. worker.RunWorkerCompleted += (sender, e) => 
  27. {
  28.     if (e.Cancelled) MessageBox.Show("任务已取消!");
  29.     else if (e.Error != null) MessageBox.Show($"错误:{e.Error.Message}");
  30.     else MessageBox.Show("任务完成!");
  31. };
  32. // 启动任务
  33. 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以得到更当代的编程体验。





实例(源码)

  1. public partial class Form2 : Form
  2. {
  3.     public  BackgroundWorker worker = new BackgroundWorker();
  4.     public Form2()
  5.     {
  6.         InitializeComponent();
  7.     }
  8.     private void Form2_Load(object sender, EventArgs e)
  9.     {
  10.         // Worker 工人
  11.         // Reports 报告
  12.         // Progress 进度
  13.         // WorkeyRepoetsProgress 是否支持BackgroundWorker报告异步任务进度的功能
  14.         worker.WorkerReportsProgress = true;
  15.         // WorkerSupportsCancellation  是否支持异步取消操作
  16.         worker.WorkerSupportsCancellation = true;
  17.         // 三个事件
  18.         // 1 DoWork: 做异步耗时的操作(调用RunWorkerAsync方法之后触发)
  19.         worker.DoWork += Worker_DoWork;
  20.         // 2 ProgressChange 进度发生变化的事件,WorkerReportsProgress属性true的时候触发
  21.         worker.ProgressChanged += Worker_ProgressChanged;
  22.         // 3 RWorkerCompleted 后台操作完成的时候触发,取消或者异常的时候都会触发
  23.         worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
  24.     }
  25.     //做异步任务的函数
  26.     private void Worker_DoWork(object sender, DoWorkEventArgs e)
  27.     {
  28.         //模拟处理超时的操作
  29.         Random rnd = new Random();
  30.         for (int i = 0; i < 80; i++)
  31.         {
  32.             if (worker.CancellationPending) //判断用户是否取消了后台任务
  33.             {
  34.                 e.Cancel = true; //取消后台任务
  35.                 return;
  36.             }
  37.             else
  38.             {
  39.                 //耗时任务(文件读写,通讯、加载tb块)
  40.                 Thread.Sleep(rnd.Next(100, 1000)); //休眠100-1000ms之间,模拟耗时的
  41.                 //报告进度
  42.                 int progress = (int)Math.Round(((i + 1) / 80.0) * 100);
  43.                 progress = progress > 100 ? 100 : progress;
  44.                 worker.ReportProgress(progress);// 触发进度变化的事件
  45.             }
  46.         }
  47.     }
  48.     //加载进度的函数
  49.     private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  50.     {
  51.         progressBar1.Value = e.ProgressPercentage;// 把ReportProgress(progress)函数里面的参数传递过来,取出
  52.     }
  53.     //后台操作处理完的函数
  54.     private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  55.     {
  56.         this.BackColor = Color.Red;// 后台任务执行完之后的操作
  57.     }
  58.     //开始异步任务的按钮
  59.     private void button1_Click(object sender, EventArgs e)
  60.     {
  61.         Console.WriteLine(worker.IsBusy);// backWrork是否是繁忙状态
  62.         if (!worker.IsBusy) // 空闲状态下
  63.         {
  64.             worker.RunWorkerAsync();// 开始后台任务
  65.         }
  66.     }
  67.     //取消异步任务的按钮
  68.     private void button2_Click(object sender, EventArgs e)
  69.     {
  70.         if (worker.IsBusy) //非空闲状态下取消
  71.         {
  72.             worker.CancelAsync();//取消后台任务
  73.         }
  74.     }
  75. }
复制代码












免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表