backgroundworkerC# form发起backgroundworker 当form close时 backgroundworker 还会继续工作吗

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

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 属性查看否已该属性设置 truetrue应该结束辅助执行点需要注意DoWork 事件处理程序代码能发取消请求已经完处理工作DoWork事件处理程序或辅助能错设置 CancellationPending属性true机种情况即使调用 CancelAsync发取消异步操作请求RunWorkerCompleted 事件处理程序RunWorkerCompletedEventArgs 参数 Cancelled 标志设置 true线程编程经现竞争条件问题编写代码候需要考虑 执行异步操作需要跟踪异步操作执行进度BackgroundWorker类提供 ReportProgress 调用该引发 ProgressChanged 事件通注册该事件事件处理程序获取异步执行进度信息签名: publicvoidReportProgress(int percentProgress); publicvoidReportProgress(int percentProgress,Object userState); 该包含两版本percentProgress表示进度百比取值0-100userState选参数表示自定义用户状态 同CancelAsync BackgroundWorkerWorkerReportsProgress 属性设置 trueReportProgress 才调用功否则引发InvalidOperationException异 面已经提 BackgroundWorker3属性CancellationPending用提示操作否已经取 消WorkerReportsProgressWorkerSupportsCancellation别用设置否允许进度汇报进行取消操作 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 事件处理程序获取异步操作结信息ProgressChangedRunWorkerCompleted事件处理程序安全同用户界面进行 通信 应用示例 面通简单示例演示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属性调用BackgroundWorkerCancelAsync 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; }

c# 窗体backgroundworker

1)【问题原因】 flag_read=1; data.RunWorkerAsync(); //问题原因:在这个while处死循环了! while?(flag_read==1)?;?//<--死循环2)【解决办法】 如果你采用BackgroundWorker来执行后台操作,可以用BackgroundWorker提供的结束操作事件来处理后台操作结束时的操作 //当backgroundWorker做完后发生的事件 backgroundWorker.RunWorkerCompleted?+=? ????new?RunWorkerCompletedEventHandler(this.bkWorkerCompleted);????? ?private?void?bkWorkerCompleted(object?sender,?DoWorkEventArgs?e) ?{ ?????//在此写处理后台操作完成的代码 ?}

c#窗体 如何在backgroundworker的DoWork中结束这个后台?

你好,BackgroundWorker的DoWork事件的委托签名如下:   private void DoWork(object?sender, DoWorkeventArgs e)   其中参数e包含了大量信息,同时能够接收使用e.Cancel=true令worker取消任务。

  需要在DoWork中取消,应使用e.Cancel=true;return;   需要在外部取消,应: 1. 在初始化时令backgroundWorker1.WorkerReportsProgress =?true; 2. 在外部控制的地方(如按钮事件)backgroundWorker1.CancelAsync(); 3. CancelAsync会更改worker的CancellationPending标志,所以在DoWork中应有类似下面的片段判断并退出。

?if(backgroundWorker1.CancellationPending) { e.Cancel=true; return;}   最后,在DoWork退出后,如需在外部得知是何种原因导致结束(取消或完成),请在worker的RunWorkerCompleted事件中检查参数e.Cancel属性。

c# backgroundworker+while(true)+界面修改

单独打开4个线程,就是4个Backgroundworker,然后一一进行处理。

worker1: worker2: ..... 8个变量完全足够表示8个目录中的文件变化了啊。

如a -&gt; b ,由worker1处理,执行成功,a-1,b+1

如何使用BackgroundWorker组件执行异步操作?

//在另一个线程上运行事件处理和序 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { e.Result = i((int)e.Argument, this.backgroundWorker1, e); } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.progressBar1.Value = e.ProgressPercentage; } private 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();//显示结果 } numericUpDown1.Enabled = true;//启用numericUpDown控件 startAsyncButton.Enabled = true;//启用开始按钮 cancelAsyncButton.Enabled = false;//停用取消按钮 } private void startAsyncButton_Click(object sender, EventArgs e) { resultLabel.Text = String.Empty;//得到空字符串对象 this.numericUpDown1.Enabled = false;//停用numericUpDown控件 this.startAsyncButton.Enabled = false;//停用开始按钮 this.cancelAsyncButton.Enabled = true;//启用取消按钮 numberToCompute = (int)numericUpDown1.Value;//得到numericUpDown控件的值 highestPercentageReached = 0;//设置值为0 backgroundWorker1.RunWorkerAsync(numberToCompute);//开始执行后台操作 } long i(int n, BackgroundWorker worker, DoWorkEventArgs e) { if ((n < 0) || (n > 91)) { throw new ArgumentException(//抛出异常 "value must be >= 0 and <= 91", "n"); } long result = 0;//声明长整型变量并赋值 if (worker.CancellationPending)//判断是否已经取消后台操作 { e.Cancel = true;//设置取消事件 } else { if (n < 2) { result = 1;//方法返回1 } else { result = i(n - 1, worker, e) +//使用递归得到结果 i(n - 2, worker, e); } int percentComplete = (int)((float)n / (float)numberToCompute * 100); if (percentComplete > highestPercentageReached) { highestPercentageReached = percentComplete; worker.ReportProgress(percentComplete); } } return result;//返回结果 } private void cancelAsyncButton_Click(object sender, EventArgs e) { this.backgroundWorker1.CancelAsync();//取消挂起的后台操作 cancelAsyncButton.Enabled = false;//停用取消按钮 }//来源CodeGo.ent

C# form发起backgroundworker 当form close时 backgroundworker 还会继续工作吗

这分两种情况,如果是主窗体退出的话backgroundworker也会退出,如果backgroundworker是在子窗体中的话,关闭子窗体,backgroundworker还会继续工作。

搬瓦工最新套餐KVM,CN2线路

搬瓦工在国内非常流行的主机商,以提供低价的vps著称.不过近几年价格逐渐攀升.不过稳定性和速度一向不错.依然深受国内vps爱好者喜爱.新上线的套餐经常卖到断货.支持支付宝,paypal很方便购买和使用.官网网站:https://www.bandwagonhost.com[不能直接访问,已墙]https://www.bwh88.net[有些地区不能直接访问]https://www.bwh81.net...

CloudCone(12.95美元/月CN2 GT线路,KVM架构1 Gbps带宽

整理一下CloudCone商家之前推送的闪购VPS云服务器产品,数量有限,活动推出可能很快机器就售罄了,有需要美国便宜VPS云服务器的朋友可以关注一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2017年的美国服务器提供商,国外实力大厂,自己开发的主机系统面板,CloudCone主要销售美国洛杉矶云服务器产品,优势特点是...

创梦云 香港沙田、长沙联通2核1G仅需29元一个月 挂机宝7元一个月

商家介绍:创梦云是来自国内的主机销售商,成立于2018年4月30日,创梦云前期主要从事免备案虚拟主机产品销售,现在将提供5元挂机宝、特惠挂机宝、香港云服务器、美国云服务器、低价挂机宝等产品销售。主打高性价比高稳定性挂机宝、香港云服务器、美国云服务器、香港虚拟主机、美国虚拟主机。官方网站:http://cmy0.vnetdns.com本次促销产品:地区CPU内存硬盘带宽价格购买地址香港特价云服务器1...

backgroundworker为你推荐
isbackground什么叫做背景反应?background reactionmergefield邮件合并日期,想让电子表格中的日期格式与WORD中的日期格式一致flash实例FLASH中实例是个什么概念,真心期待着!!!期待好心人,感恩!希望大家多讨论国家法规数据库哪个常用的法律APP比较好用?java程序员招聘为什么Java程序员工资都很高动画分镜头脚本经典动画片分镜头脚本怎么查微信注册时间怎么知道微信上次登录时间微盟价格微盟怎么收费?btestBTEST软件测试工程师培训女孩适合学吗?就业前景如何呢?网页背景音乐代码网页背景音乐的源码一般在哪?
php主机空间 vps论坛 西安服务器 免备案空间 patcha 华为云主机 卡巴斯基永久免费版 阿里云浏览器 域名转接 卡巴斯基试用版 电信虚拟主机 息壤代理 微软服务器操作系统 万网主机管理 下载速度测试 主机管理系统 数据库空间 中国电信测速网站 存储服务器 asp空间 更多