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还会继续工作。
妮妮云的来历妮妮云是 789 陈总 张总 三方共同投资建立的网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑妮妮云的市场定位妮妮云主要代理市场稳定速度的云服务器产品,避免新手购买云服务器的时候众多商家不知道如何选择,妮妮云就帮你选择好了产品,无需承担购买风险,不用担心出现被跑路 被诈骗的情况。妮妮云的售后保证妮妮云退款 通过于合作商的友好协商,云服务器提供2天内全额退款,超过2天不退款 物...
BuyVM商家属于比较老牌的服务商,早年有提供低价年付便宜VPS主机还记得曾经半夜的时候抢购的。但是由于这个商家风控非常严格,即便是有些是正常的操作也会导致被封账户,所以后来陆续无人去理睬,估计被我们风控的抢购低价VPS主机已经手足无措。这两年商家重新调整,而且风控也比较规范,比如才入手他们新上线的流媒体优化VPS主机也没有不适的提示。目前,BuyVM商家有提供新泽西、迈阿密等四个机房的VPS主机...
今天9月10日是教师节,我们今天有没有让孩子带礼物和花送给老师?我们这边不允许带礼物进学校,直接有校长在门口遇到有带礼物的直接拦截下来。今天有看到Friendhosting最近推出了教师节优惠,VPS全场45折,全球多机房可选,有需要的可以看看。Friendhosting是一家成立于2009年的保加利亚主机商,主要提供销售VPS和独立服务器出租业务,数据中心分布在:荷兰、保加利亚、立陶宛、捷克、乌...
backgroundworker为你推荐
excel大写金额在Excel中如何输入数字直接显示大写金额?broadcast播哈尔滨哪里有卖broadcast播 这个服装品牌的java程序员招聘Java程序员,一般招聘都要求些啥gas是什么意思gc是什么意思啊?怎样删除聊天记录如何删除聊天微盟价格微盟怎么收费?flex是什么Adobe是什么软件?btestBTEST软件测试工程师培训女孩适合学吗?就业前景如何呢?driversbackup电脑里有个“Backup”文件夹是干什么的pps官方网站什么叫PPS?是什么网站?
云服务器租用 提供香港vps 云网数据 blackfriday 512m内存 刀片服务器是什么 100m空间 免费申请个人网站 免费测手机号 支持外链的相册 shopex主机 百度云加速 atom处理器 学生服务器 江苏徐州移动 hdroad restart windowsserverr2 删除域名 免费php空间申请 更多