backgroundworker如何使用backgroundWorker进行异步操作

backgroundworker  时间:2021-06-19  阅读:()

C#中 BackGroundWorker与Thread的区别?

使用Thread ,在多线程编程中经常需要在线程间共享资源。

例如,多个线程可能需要访问一个共享数据库,或对一组系统变量进行更新。

当多个线程同时竞争共享资源的访问权时,就可能会出现“争用状态”。

您可以通过使用“锁”来保护代码的关键部分免受争用状态的损坏。

当然这需要通过细致的手动编码来实现. 在.NET Framework 2.0中 BackgroundWorker 组件取代了 System.Threading 命名空间并添加了功能,简化了面向用户的编码难度,可以很好的帮你处理多线程间的调度,保护等方面的问题,通过提供面向对象的线程模型来使您能够快速、方便地创建多线程应用程序。

对于对线程开发, 需要注意:是否使用lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断,是否及时的创建和终止线程,是否使用线程池来管理每一个线程,此外,简单的创建及销毁线程的测试程序是不足以说明该技术的实际应用的.

BackGroundWorker控件,用于在C#中实现类似线程的操作。(跪求关键代码)

要把backgroundWorker的WorkerReportsProgress的属性改成true private void button1_Click(object sender, EventArgs e) { progressBar1.Maximum = 1000; backgroundWorker1.RunWorkerAsync(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int j = 1000; for (int i = 0; i < j; i++) { backgroundWorker1.ReportProgress(i); Thread.Sleep(1000); } } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; }

winform怎么使用后台处理控件backgroundworker

1. 在winform项目中,打开工具箱,找到backgroundworker控件并拖入窗体中,这时窗体下方出现backgroundworker实例 2. 3. 2 4. 右击backgroundworker实例,在菜单中选择“属性” 5. 6. 3 7. 在属性窗口中,点击闪电按钮切换到控件的事件列表 8. 9. 4 10. 分别在DoWork 和RunWorkerCompleted的属性处双击来生成绑定事件,可以看到后台自动生成了事件签名 11. 12. 5 13. 为了调用backgroundworker控件,在窗口中拖入一个按钮。

另外,拖入一个label来显示结果 14. 15. 6 16. 双击按钮,进入后台代码。

在单击事件写上测试代码,如下图所示。

其中, 17. label1.Text = "start";表明后台处理开始 18. backgroundWorker1.RunWorkerAsync();调用backgroundWorker1 19. 20. 7 21. 为了模拟复杂费时间的处理,在Dowork事件中加入如下代码,代码含义是:循环5次,每次暂停1秒钟,总共暂停5秒钟。

22. for (int i = 0; i < 5; i++) 23. { 24. Thread.Sleep(1000); 25. } 26. 在RunWorkerCompleted事件中加入如下代码,代码含义是:复杂费时间的处理完成后,给出提示。

27. label1.Text = "finish"; 28. 29. 8 30. 运行工程,测试效果。

点击按钮,label的内容变成start,这时等上5秒钟,label的内容变成finish,测试成功

C# backgroundworker 如何使用 线程池

你到底是想用backgroundworker还是想用线程池?还是想了解backgroundworker在内部是怎么使用线程池的? 补充: 结合不了,你可以在BackgroundWorker把所有的工作都做好然后再给UI线程。

如果想使用ThreadPool的话,你需要在结尾的时候调用Control.Invoke()把结果代码在UI线程上执行,就不会出问题了。

其实还有一个,在ComponentModel有AsyncOperation,BackgroundWorker底层使用这个东西来解决异步操作问题的,你可以用这个

如何使用backgroundWorker进行异步操作

组件介绍 BackgroundWorker类位于System.ComponentModel 命名空间中,通过该类在单独的线程上执行操作实现基于事件的异步模式。

下面对BackgroundWorker类的主要成员进行介绍。

BackgroundWorker类的第1个主要方法是RunWorkerAsync,该方法提交一个以异步方式启动运行操作的请求,发出请求后,将引发 DoWork 事件,在事件处理程序中开始执行异步操作代码。

RunWorkerAsync 方法签名如下, publicvoidRunWorkerAsync(); publicvoidRunWorkerAsync(Object argument); 如果异步操作需要操作参数,可以将其作为argument参数提供,由于参数类型为Object,因此访问时可能需要进行类型转换。

CancelAsync 方 法提交终止异步操作的请求,并将 CancellationPending 属性设置为 true。

需要注意的是,CancelAsync 方法是否调用成功,同WorkerSupportsCancellation 属性相关,如果允许取消执行的异步操作,需将WorkerSupportsCancellation 属性设置为true,否则调用该方法将抛出异常。

CancelAsync方法不含参数,方法签名如下, publicvoid CancelAsync(); 调用 CancelAsync 方法时,BackgroundWorker的 CancellationPending 属性值将被设置为true,因此在编写单独线程中执行的辅助方法时,代码中应定期检查 CancellationPending 属性,查看是否已将该属性设置为 true,如果为true,应该结束辅助方法的执行。

有一点需要注意的是,DoWork 事件处理程序中的代码有可能在发出取消请求时已经完成处理工作,因此,DoWork事件处理程序或辅助方法可能会错过设置 CancellationPending属性为true的时机。

在这种情况下,即使调用 CancelAsync方法发出了取消异步操作请求,RunWorkerCompleted 事件处理程序中RunWorkerCompletedEventArgs 参数的 Cancelled 标志也不会被设置为 true,这是在多线程编程中经常会出现的竞争条件问题,因此编写代码的时候需要考虑。

在执行异步操作时,如果需要跟踪异步操作执行进度,BackgroundWorker类提供了 ReportProgress 方法,调用该方法将引发 ProgressChanged 事件,通过注册该事件在事件处理程序中获取异步执行进度信息。

方法签名如下: publicvoidReportProgress(int percentProgress); publicvoidReportProgress(int percentProgress,Object userState); 该方法包含两个版本,percentProgress表示进度百分比,取值为0-100,userState为可选参数表示自定义用户状态。

同CancelAsync 方法一样,BackgroundWorker的WorkerReportsProgress 属性设置为 true时,ReportProgress 方法才会调用成功,否则将引发InvalidOperationException异常。

上面已经提到了 BackgroundWorker的3个属性,CancellationPending用来提示操作是否已经取 消,WorkerReportsProgress和WorkerSupportsCancellation分别用来设置是否允许进度汇报和进行取消操作。

publicboolCancellationPending { get; } publicboolWorkerReportsProgress { get; set; } publicboolWorkerSupportsCancellation { get; set; } 另外一个会用到的属性是IsBusy, publicbool IsBusy { get; } 通过该属性查询BackgroundWorker实例是否正在运行异步操作,如果 BackgroundWorker 正在运行异步操作,则为true,否则为false。

BackgroundWorker类包含3个事件,在事件处理程序中可进行异步操作辅助代码编写和同用户界面信息交互。

publiceventDoWorkEventHandler DoWork; publiceventProgressChangedEventHandler ProgressChanged; publiceventRunWorkerCompletedEventHandler RunWorkerCompleted; DoWork事 件处理程序用来调用辅助方法进行实际处理操作,由于该事件处理程序在不同于UI的线程上执行,因此需要确保在 DoWork 事件处理程序中不操作任何用户界面对象。

如果辅助方法需要参数支持,可以通过RunWorkerAsync方法传入,在 DoWork 事件处理程序中,通过 DoWorkEventArgs.Argument 属性提取该参数。

在异步操作期间,可以通过 ProgressChanged事件处理程序获取异步操作进度信息,通过RunWorkerCompleted 事件处理程序获取异步操作结果信息,在ProgressChanged和RunWorkerCompleted的事件处理程序中可以安全的同用户界面进行 通信。

应用示例 下面通过一个简单的示例来演示BackgroundWorker组件的典型应用。

在本示例中,实现一个数值的求和操作,该操作本身运行很快,为模拟处理过程有一个可感知的时间段,在辅助方法中调用了Thread.Sleep方法。

示例程序通过Windows Forms展示,显示了对1-100的数值进行求和操作,界面如下, 图1:应用程序界面 下面对主要实现代码进行说明,先看一下BackgroundWorker类的初始化,在初始化过程中注册了3个事件,允许异步辅助方法调用,以及异步操作进度通知和操作取消。

private System.ComponentModel.BackgroundWorker backgroundWorker1; private void InitializeBackgoundWorker() { this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); this.backgroundWorker1.WorkerReportsProgress = true; this.backgroundWorker1.WorkerSupportsCancellation = true; this.backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); } 通过StartAsync按钮事件处理程序开始异步处理操作请求,事件处理程序如下, private void startAsyncButton_Click(object sender, EventArgs e) { resultLabel.Text = String.Empty; this.numericUpDown1.Enabled = false; this.startAsyncButton.Enabled = false; this.cancelAsyncButton.Enabled = true; //获取计算数值. int numberToCompute = (int)numericUpDown1.Value; //启动异步操作. backgroundWorker1.RunWorkerAsync(numberToCompute); } startAsyncButton_Click处理程序首先对一些界面控件进行状态设置,然后调用BackgroundWorker实例的RunWorkerAsync方法开始执行异步操作,而此时就会触发DoWork事件。

void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; e.Result = ComputeAdd((int)e.Argument, worker, e); } 在DoWork事件处理程序中,通过DoWorkEventArgs.Argument属 性获取传入的参数传递给ComputeAdd辅助方法,并把处理结果保存到DoWorkEventArgs.Result属性中,最后在 RunWorkerCompleted 事件处理程序的RunWorkerCompletedEventArgs.Result 属性中获取处理结果。

如果在DoWork事件处理程序中出现异常,则 BackgroundWorker 将捕获该异常并将其传递到 RunWorkerCompleted 事件处理程序,在该事件处理程序中,异常信息作为 RunWorkerCompletedEventArgs 的 Error 属性公开。

private long ComputeAdd(int n, BackgroundWorker worker, DoWorkEventArgs e) { long result = 0; for (int i = 1; i <= n; i++) { if (worker.CancellationPending) { e.Cancel = true; break; } else { result += i; Thread.Sleep(500); int percentComplete = (int)((float)i / (float)n * 100); worker.ReportProgress(percentComplete); } } return result; } 在辅助方法中,代码定期访问BackgroundWorker实 例的CancellationPending属性,如果调用了BackgroundWorker的CancelAsync 方法,那么CancellationPending属性值就会被设置为true,辅助方法就结束执行。

另外,在辅助方法中实现了进度汇报功能,通过调用 worker.ReportProgress方法触发ProgressChanged事件,接着通过ProgressChanged事件处理程序来更新进 度显示。

void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.progressBar1.Value = e.ProgressPercentage; } 最后,在 RunWorkerCompleted事件处理程序中可以得到异步处理结果信息,分析异步操作是正常执行结束还是在处理中被取消或者是执行出现错误异常而 终止。

对于处理结果信息的访问有一个标准的顺序,先是判断异步处理是否异常结束,接着判断是否执行了取消操作,最后访问处理结果。

void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show(e.Error.Message); } else if (e.Cancelled) { resultLabel.Text = "Canceled"; } else { resultLabel.Text = e.Result.ToString(); } this.numericUpDown1.Enabled = true; startAsyncButton.Enabled = true; cancelAsyncButton.Enabled = false; }

提速啦(24元/月)河南BGP云服务器活动 买一年送一年4核 4G 5M

提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...

野草云提供适合入门建站香港云服务器 年付138元起 3M带宽 2GB内存

野草云服务商在前面的文章中也有多次提到,算是一个国内的小众服务商。促销活动也不是很多,比较专注个人云服务用户业务,之前和站长聊到不少网友选择他们家是用来做网站的。这不看到商家有提供香港云服务器的优惠促销,可选CN2、BGP线路、支持Linux与windows系统,支持故障自动迁移,使用NVMe优化的Ceph集群存储,比较适合建站用户选择使用,最低年付138元 。野草云(原野草主机),公司成立于20...

DogYun春节优惠:动态云7折,经典云8折,独立服务器月省100元,充100送10元

传统农历新年将至,国人主机商DogYun(狗云)发来了虎年春节优惠活动,1月31日-2月6日活动期间使用优惠码新开动态云7折,经典云8折,新开独立服务器可立减100元/月;使用优惠码新开香港独立服务器优惠100元,并次月免费;活动期间单笔充值每满100元赠送10元,还可以参与幸运大转盘每日抽取5折码,流量,余额等奖品;商家限量推出一款年付特价套餐,共100台,每个用户限1台,香港VPS年付199元...

backgroundworker为你推荐
isbackground急!there is no attribute "background"怎么改?ico监管新加坡代币ICO备案怎么做比思论坛永久域名不知道为什么 比思论坛的网站打不开 怎么办呐国家法规数据库在哪里可以找到比较全面的法律法规更新的信息?cursorlocation在ENVI中双击遥感图像出来个CURSOR LOCATION/value对话框。下面有个LL : 31?6'21.84"N, 117?9'11.78"E淘码除了爱码,现在哪个验证码平台还能用动画分镜头脚本求份《仙剑奇侠传5》剧情动画分镜头脚本 越多越好在线沟通有效沟通的六个要点微盟价格做微盟平台的销售怎么样,有前景吗西安娱乐西安市最刺激好玩的娱乐场所是哪里?
手机网站空间 cc域名 上海服务器租用 中文域名申请 希网动态域名 香港加速器 主机点评 500m空间 150邮箱 bgp双线 129邮箱 爱奇艺vip免费领取 绍兴电信 卡巴斯基破解版 购买国外空间 万网空间购买 吉林铁通 免费私人服务器 域名dns 百度云加速 更多