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 -> 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.entC# form发起backgroundworker 当form close时 backgroundworker 还会继续工作吗
这分两种情况,如果是主窗体退出的话backgroundworker也会退出,如果backgroundworker是在子窗体中的话,关闭子窗体,backgroundworker还会继续工作。
CheapWindowsVPS是一家成立于2007年的老牌国外主机商,顾名思义,一个提供便宜的Windows系统VPS主机(同样也支持安装Linux系列的哈)的商家,可选数据中心包括美国洛杉矶、达拉斯、芝加哥、纽约、英国伦敦、法国、新加坡等等,目前商家针对VPS主机推出5折优惠码,优惠后最低4GB内存套餐月付仅4.5美元。下面列出几款VPS主机配置信息。CPU:2cores内存:4GB硬盘:60G...
JUSTG,这个主机商第二个接触到,之前是有介绍到有提供俄罗斯CN2 GIA VPS主机活动的,商家成立时间不久看信息是2020年,公司隶属于一家叫AFRICA CLOUD LIMITED的公司,提供的产品为基于KVM架构VPS主机,数据中心在非洲(南非)、俄罗斯(莫斯科),国内访问双向CN2,线路质量不错。有很多服务商实际上都是国人背景的,有的用英文、繁体搭建的冒充老外,这个服务商不清楚是不是真...
Bluehost怎么样,Bluehost好不好,Bluehost成立十八周年全场虚拟主机优惠促销活动开始,购买12个月赠送主流域名和SSL证书,Bluehost是老牌虚拟主机商家了,有需要虚拟主机的朋友赶紧入手吧,活动时间:美国MST时间7月6日中午12:00到8月13日晚上11:59。Bluehost成立于2003年,主营WordPress托管、虚拟主机、VPS主机、专用服务器业务。Blueho...
backgroundworker为你推荐
机房360电脑上的杀毒软件被360覆盖了,怎么找回?爱短信官网求助。爱短信爱聊怎么用?刷ip流量免费刷流量软件有哪些?哪个免费刷流量工具最好?云输入法QQ云输入法的候选窗口是什么样的?方正证券官方网方正证券完美版下载云办公平台Gleasy云办公平台解决了哪些问题?网站客服代码怎么在网页用HTML代码设置QQ客服yui3yui 3 月9日 出的专辑的情报particular教程AE的particular的particle设置在线操作系统什么是计算机操作系统?其作用主要有哪些
linuxvps 抗投诉vps主机 virpus 老鹰主机 tk域名 免费个人空间申请 建立邮箱 新家坡 世界测速 息壤代理 酷番云 西安服务器托管 学生服务器 97rb phpinfo 卡巴斯基免费版 paypal登陆 主机箱 关闭qq空间申请 电脑主机报警 更多