在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题。解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完成。但是原生接口的线程操作有一些难度,如果要更进一步的去完成线程间的通信就会难上加难。

用法概述
在窗体上构建一个BackgroundWorker 实例,在它的 DoWork事件处理函数中添加耗时的运算,然后调用它的RunWorkerAsync方法就可以了。

private BackgroundWorker _demoBGWorker = new BackgroundWorker();
_demoBGWorker.DoWork += BGWorker_DoWork;
_demoBGWorker.RunWorkerAsync();
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{//在这里执行耗时的运算。int sum = 0;for (int i = 0; i <= 100; i++){sum += i;}
}

是不是有点太简单了?那么让我们考虑下面的问题:
如果我们想要把参数传递给运算过程该怎么做?
在运算过程中我们希望把实时的信息显示在UI上该怎么办?
如果我们想要取消正在进行的运算该怎么办?
如果运算过程出现异常我们又该如何处理?
接下来我们就一个一个的处理这些问题。

把参数传递给运算过程
直接把100写死到运算过程中可不好,我们还打算允许用户指定求和的范围呢!所以需要把100作为参数传递给计算过程。在概述中我们通过调用RunWorkerAsync方法启动计算过程,其实这个方法可以接受一个 object 类型的参数。通过它我们就可以把任何数据传递给计算过程:

//别忘了设置滚动条。
this.progressBarSum.Maximum = 100;
_demoBGWorker.RunWorkerAsync(100);
//下面是更新后的 BGWorker_DoWork 方法:
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{//在这里执行耗时的运算。int endNumber = 0;if(e.Argument != null){endNumber = (int)e.Argument;}int sum = 0;for (int i = 0; i <= endNumber; i++){sum += i;}
}

BGWorker_DoWork事件处理函数通过参数 e 的Argument属性传来了我们期望的运算信息。

C# 多线程BackgroundWorker相关推荐

  1. 解析大型.NET ERP系统 高质量.NET代码设计模式

    1 缓存 Cache 系统中大量的用到缓存设计模式,对系统登入之后不变的数据进行缓存,不从数据库中直接读取.耗费一些内存,相比从SQL Server中再次读取数据要划算得多.缓存的基本设计模式参考下面 ...

  2. .net开发中用BackgroundWorker实现多线程

    http://www.111cn.net/net/net/74654.htm BackgroundWorker是?net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作.现在我们 ...

  3. BackgroundWorker 实现多线程操作

    背景介绍 在做程序的过程中,我们很可能遇到这样的情况:当我们执行一个比较耗时的操作,即界面加载数据量略大的时,在该操作未完成之前再去操作界面,就会出现停止响应的情况,这称为界面假死状态,那一个小圆圈转 ...

  4. C#使用BackgroundWorker实现多线程

    BackgroundWorker的对象定义: this.backgroundWorker.WorkerSupportsCancellation = true;this.backgroundWorker ...

  5. C# BackgroundWorker 详解

    C# BackgroundWorker 详解 在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启 ...

  6. C#中的BackgroundWorker控件

    Keywords: C# .NET BackgroundWorker Source: http://txw1958.cnblogs.com/ BackgroundWorker是.NET Framewo ...

  7. 《C#多线程编程实战(原书第2版)》——第3章 使用线程池 3.1 简介

    本节书摘来自华章出版社<C#多线程编程实战(原书第2版)>一书中的第3章,第3.1节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问 ...

  8. C# 多线程參数传递

    1.通过实体类来传递(能够传递多个參数与获取返回值),demo例如以下: 须要在线程中调用的函数: namespace ThreadParameterDemo {public class Functi ...

  9. c# BackgroundWorker组件介绍(属性、方法、事件)

    c# BackgroundWorker组件介绍(属性.方法.事件) 2008-07-03 16:28 在VS2005中添加了BackgroundWorker组件,该组件在多线程编程方面使用起来非常方便 ...

  10. C#在后台运行操作:BackgroundWorker的用法

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

最新文章

  1. vue 调用共众url_vue单页面,在微信公众号支付中遇到的URL未注册BUG解决方法-Go语言中文社区...
  2. 《中国人工智能学会通讯》——8.2 自然界中的鸽群导航行为
  3. SpringBoot集成七牛云-实现文件上传、下载、解决报错、详细案例
  4. 公众号质量改进调查问卷
  5. C++中的RAIL风格
  6. 【C# 委托 Lambda表达式】一个简单的例子
  7. Error(6,35)java: 程序包 不存在,解决办法
  8. 保存tensorboard的损失曲线为图片
  9. 使用nagios监控oracle
  10. 免费CSDN积分获取
  11. 爱了!再来推荐5个Java项目开发快速开发脚手架。项目经验和私活都不愁了~
  12. 鸿蒙汽车电动尾门工厂,汽车智能电动尾门为什么能成为汽车电子行业“新宠”?...
  13. Altium Designer 原理图输出为PDF文件
  14. 【渝粤教育】广东开放大学 电算化会计 形成性考核 (44)
  15. 科比:你知道洛杉矶每天早上四点钟是什么样子吗?
  16. 四川一度智信|小白卖家不懂选品?
  17. 用python发邮件便利之处_第18课 python 发送邮件
  18. Laravel 中管道设计模式的使用 —— 中间件实现原理探究
  19. 微软必应词典客户端的案例分析
  20. 人人车被曝近百员工聚集北京总部维权

热门文章

  1. IIC,SPI,I2S
  2. ANSYS CFD网格划分笔记1
  3. SSM实现毕业设计管理系统
  4. Android实现QQ音乐QMC格式转MP3格式
  5. SAP那些事-理论篇-5-SAP玩你还是你玩SAP
  6. cad批量打印_「CAD」打印输出设置详解——批量打印
  7. Marxan模型保护区优化与保护空缺甄选技术、InVEST生态系统中的应用
  8. CVPR2021 | 视频超分辨率中时空蒸馏方案
  9. 微软商店打开失败 - 错误代码 - 0x80131500
  10. HTML网页设计期末课程大作业 ---H5移动端电商购物网页设计35页面(包括主页,商品详情,转账,付款,购物车等页面) 功能齐全