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

OneTechCloud(31元),美国CN2 GIA高防VPS月

OneTechCloud发布了本月促销信息,全场VPS主机月付9折,季付8折,优惠后香港VPS月付25.2元起,美国CN2 GIA线路高防VPS月付31.5元起。这是一家2019年成立的国人主机商,提供VPS主机和独立服务器租用,产品数据中心包括美国洛杉矶和中国香港,Cera的机器,VPS基于KVM架构,采用SSD硬盘,其中美国洛杉矶回程CN2 GIA,可选高防。下面列出部分套餐配置信息。美国CN...

美国高防云服务器 1核 1G 10M 38元/月 百纵科技

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

NameCheap新注册.COM域名$5.98

随着自媒体和短视频的发展,确实对于传统的PC独立网站影响比较大的。我们可以看到云服务器商家的各种促销折扣活动,我们也看到传统域名商的轮番新注册和转入的促销,到现在这个状态已经不能说这些商家的为用户考虑,而是在不断的抢夺同行的客户。我们看到Namecheap商家新注册域名和转入活动一个接一个。如果我们有需要新注册.COM域名的,只需要5.98美元。优惠码:NEWCOM598。同时有赠送2个月免费域名...

backgroundworker为你推荐
flash实例Flash元件和实例的概念及关系?netbios协议机子上启动了netbios协议,为什么还是运行不了netbios命令微信如何只发文字微信朋友圈如何只发文字,怎么发文字不要图java程序员招聘为什么Java程序员工资都很高网络安全密钥网络安全密钥和wifi密码有什么区别全局钩子delphi 键盘全局钩子动画分镜头脚本动漫脚本和分镜头的区别?懂的进特斯拉model3降价特斯拉股价为何暴跌?防火墙技术应用防火墙的应用与研究论文短信套餐移动有什么短信包月套餐,怎么开通?
域名升级访问中 私服服务器租用 5折 好看的桌面背景图片 国外在线代理 双拼域名 789电视网 卡巴斯基免费试用版 无限流量 net空间 国外代理服务器 ncp 海外加速 cx域名 ubuntu安装教程 在线tracert paypal兑换 linux命令vi ssd crontab 更多