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; }

Virmach($7.2/年)特价机器发放

在八月份的时候有分享到 Virmach 暑期的促销活动有低至年付12美元的便宜VPS主机,这不开学季商家又发布五款年付VPS主机方案,而且是有可以选择七个数据中心。如果我们有需要低价年付便宜VPS主机的可以选择,且最低年付7.2美元(这款目前已经缺货)。这里需要注意的,这次发布的几款便宜年付方案,会在2021年9月30日或者2022年4月39日,分两个时间段会将INTEL CPU迁移至AMD CP...

ATCLOUD-KVM架构的VPS产品$4.5,杜绝DDoS攻击

ATCLOUD.NET怎么样?ATCLOUD.NET主要提供KVM架构的VPS产品、LXC容器化产品、权威DNS智能解析、域名注册、SSL证书等海外网站建设服务。 其大部分数据中心是由OVH机房提供,其节点包括美国(俄勒冈、弗吉尼亚)、加拿大、英国、法国、德国以及新加坡。 提供超过480Gbps的DDoS高防保护,杜绝DDoS攻击骚扰,比较适合海外建站等业务。官方网站:点击访问ATCLOUD官网活...

百纵科技(19元/月),美国洛杉矶10G防御服务器/洛杉矶C3机房 带金盾高防

百纵科技官网:https://www.baizon.cn/百纵科技:美国云服务器活动重磅来袭,洛杉矶C3机房 带金盾高防,会员后台可自助管理防火墙,添加黑白名单 CC策略开启低中高.CPU全系列E52680v3 DDR4内存 三星固态盘列阵。另有高防清洗!美国洛杉矶 CN2 云服务器CPU内存带宽数据盘防御价格1H1G10M10G10G19元/月 购买地址2H1G10M10G10G29元/月 购买...

backgroundworker为你推荐
windowsmediawindows media player打开怎么设置存储区域网络什么是存储局域网?组建它需要哪些内容?ico监管BTCB是什么?avc是什么格式电厂AVC啥意思?sdfsdfsdfsdf小米手机投诉热线刷ip流量免费刷流量软件有哪些?哪个免费刷流量工具最好?上行宽带上行宽带是什么?网站客服代码怎么在网页用HTML代码设置QQ客服网站客服代码请问怎么在网页里面加入在线客服系统的代码,代码要怎么获得?动画分镜头脚本请问什么是动画分镜头脚本,什么是电影分镜头脚本以及什么是广告分镜头脚本?
安徽虚拟主机 国外vps 阿里云搜索 flashfxp怎么用 photonvps kvmla 域名优惠码 免费全能空间 微软服务器操作系统 怎么建立邮箱 酸酸乳 购买空间 阵亡将士纪念日 mteam .htaccess 建站技术 月付空间 俄勒冈州 tracert 瓦工工资 更多