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还会继续工作。
LOCVPS发来了针对元旦新年的促销活动,除了全场VPS主机8折优惠外,针对德国/荷兰KVM #1/美国KVM#2 VPS提供终身7折优惠码(限量50名,先到先得)。LOCVPS是一家成立于2012年的国人VPS服务商,提供中国香港、韩国、美国、日本、新加坡、德国、荷兰、俄罗斯等地区VPS服务器,基于KVM或XEN架构(推荐优先选择KVM),均选择直连或者优化线路,国内延迟低,适合建站或远程办公使...
继阿里云服务商推出轻量服务器后,腾讯云这两年对于轻量服务器的推广力度还是比较大的。实际上对于我们大部分网友用户来说,轻量服务器对于我们网站和一般的业务来说是绝对够用的。反而有些时候轻量服务器的带宽比CVM云服务器够大,配置也够好,更有是价格也便宜,所以对于初期的网站业务来说轻量服务器是够用的。这几天UCLOUD优刻得香港服务器稳定性不佳,于是有网友也在考虑搬迁到腾讯云服务器商家,对于轻量服务器官方...
六一云互联六一云互联为西安六一网络科技有限公司的旗下产品。是一个正规持有IDC/ISP/CDN的国内公司,成立于2018年,主要销售海外高防高速大带宽云服务器/CDN,并以高质量.稳定性.售后相应快.支持退款等特点受很多用户的支持!近期公司也推出了很多给力的抽奖和折扣活动如:新用户免费抽奖,最大可获得500元,湖北新购六折续费八折折上折,全场八折等等最新活动:1.湖北100G高防:新购六折续费八折...
backgroundworker为你推荐
网站客服代码怎么在网页用HTML代码设置QQ客服特斯拉model3降价特斯拉model 3中国有补贴吗泛微协同办公系统泛微软件怎么样?做协同办公的,我要来这做销售前景怎么样?请大家对这个行业或公司了解的给些建议。ps5教程怎样用PS5打字飞信发信息要钱吗使用手机飞信人别人的手机飞信发短信要钱吗测试post软件测试的测试工作有哪些重要的步骤linux启动盘制作工具如何使用ultraiso制作LinuxU盘启动盘455端口sangfor防火墙如何禁用455端口wap服务wap业务是什么意思?取英文名的网站取英文名字
最新代理服务器 网站域名空间 免费域名 私服服务器租用 vir buyvm host1plus mach5 omnis unsplash 合肥鹏博士 本网站服务器在美国 129邮箱 cdn加速原理 服务器是干什么的 常州联通宽带 免费外链相册 服务器维护 德隆中文网 华为云建站 更多