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还会继续工作。
racknerd从成立到现在发展是相当迅速,用最低的价格霸占了大部分低端便宜vps市场,虽然VPS价格便宜,但是VPS的质量和服务一点儿都不拉跨,服务器稳定、性能给力,尤其是售后方面时间短技术解决能力强,估计这也是racknerd这个品牌能如此成功的原因吧! 官方网站:https://www.racknerd.com 多种加密数字货币、信用卡、PayPal、支付宝、银联、webmoney,可...
Dynadot 是一家非常靠谱的域名注册商家,老唐也从来不会掩饰对其的喜爱,目前我个人大部分域名都在 Dynadot,还有一小部分在 NameCheap 和腾讯云。本文分享一下 Dynadot 最新域名优惠码,包括 .COM,.NET 等主流后缀的优惠码,以及一些新顶级后缀的优惠。对于域名优惠,NameCheap 的新后缀促销比较多,而 Dynadot 则是对于主流后缀的促销比较多,所以可以各取所...
Megalayer 商家主营业务是以独立服务器和站群服务器的,后来也陆续的有新增香港、菲律宾数据中心的VPS主机产品。由于其线路的丰富,还是深受一些用户喜欢的,有CN2优化直连线路,有全向国际线路,以及针对欧美的国际线路。这次有看到商家也有新增美国机房的VPS主机,也有包括15M带宽CN2优化带宽以及30M带宽的全向线路。Megalayer 商家提供的美国机房VPS产品,提供的配置方案也是比较多,...
backgroundworker为你推荐
youtube创始人鬼步舞创作者是谁flash实例flash CS3 实例的属性面板里的实例名称是指什么国家法规数据库在哪里可以找到比较全面的法律法规更新的信息?公众号付费阅读怎么利用公众号做知识付费?wow服务器状态我电脑上的魔兽服务器状态很好.但是还是玩不起来.请问可以玩了不?averagesPoisson-Arrivals-See-Time-Averages是什么意思音乐代码在html中插入mp3音频的代码是什么java程序员招聘女java程序员好找工作嘛za是哪个国家的奥洛菲是哪个国家的泛微协同办公系统泛微软件怎么样?做协同办公的,我要来这做销售前景怎么样?请大家对这个行业或公司了解的给些建议。
主机租赁 免费国内空间 备案域名 国外免费vps 怎么申请域名 新加坡服务器 台湾服务器 godaddy域名转出 免费博客空间 网通ip 193邮箱 hkg 亚马逊香港官网 qq对话框 傲盾官网 爱奇艺vip免费领取 lamp是什么意思 广东主机托管 闪讯网 美国主机 更多