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还会继续工作。

raksmart:全新cloud云服务器系列测评,告诉你raksmart新产品效果好不好

2021年6月底,raksmart开发出来的新产品“cloud-云服务器”正式上线对外售卖,当前只有美国硅谷机房(或许以后会有其他数据中心加入)可供选择。或许你会问raksmart云服务器怎么样啊、raksm云服务器好不好、网络速度快不好之类的废话(不实测的话),本着主机测评趟雷、大家受益的原则,先开一个给大家测评一下!官方网站:https://www.raksmart.com云服务器的说明:底层...

CloudServer:$4/月KVM-2GB/50GB/5TB/三个数据中心

CloudServer是一家新的VPS主机商,成立了差不多9个月吧,提供基于KVM架构的VPS主机,支持Linux或者Windows操作系统,数据中心在美国纽约、洛杉矶和芝加哥机房,都是ColoCrossing的机器。目前商家在LEB提供了几款特价套餐,最低月付4美元(或者$23.88/年),购买更高级别套餐还能三个月费用使用6个月,等于前半年五折了。下面列出几款特别套餐配置信息。CPU:1cor...

RAKsmart:美国洛杉矶独服,E3处理器/16G/1TB,$76.77/月;美国/香港/日本/韩国站群服务器,自带5+253个IPv4

RAKsmart怎么样?RAKsmart机房即日起开始针对洛杉矶机房的独立服务器进行特别促销活动:低至$76.77/月,最低100Mbps带宽,最高10Gbps带宽,优化线路,不限制流量,具体包括有:常规服务器、站群服务器、10G大带宽服务器、整机机柜托管。活动截止6月30日结束。RAKsmart,美国华人老牌机房,专注于圣何塞服务器,有VPS、独立服务器等。支持PayPal、支付宝付款。点击直达...

backgroundworker为你推荐
activity跳转android 两个activity之间是怎么实现跳转的网络视频下载器那些视频下载器比较全而且好用?国家法规数据库食品及食用农产品标准法规信息支撑和综合应用平台/食品安全标准与技术法规动态比对数据库如何查询标准gas是什么意思petrol和gas的区别网站客服代码如何将在线客服代码插入到您的网页中?医院排队系统医院门诊排队叫号系统泛微协同办公系统泛微OA系统怎么创建新人员particular教程怎样做ae粒子云效果微盟价格为什么这么多人用微盟,微盟都有哪些优势flex是什么Adobe是什么软件?
域名抢注 burstnet softlayer hawkhost 10t等于多少g 账号泄露 win8升级win10正式版 申请空间 华为网络硬盘 本网站在美国维护 有益网络 国外免费全能空间 傲盾官网 注册阿里云邮箱 宿迁服务器 网络速度 SmartAXMT800 windowsserver2008 winserver2008 机柜尺寸 更多