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还会继续工作。
Krypt这两天发布了ION平台9月份优惠信息,提供一款特选套餐年付120美元(原价$162/年),开设在洛杉矶或者圣何塞机房,支持Windows或者Linux操作系统。ion.kryptcloud.com是Krypt机房上线的云主机平台,主要提供基于KVM架构云主机产品,相对于KT主站云服务器要便宜很多,产品可选洛杉矶、圣何塞或者新加坡等地机房。洛杉矶机房CPU:2 cores内存:2GB硬盘:...
bgp.to在对日本东京的独立服务器进行6.5折终身优惠促销,低至$120/月;对新加坡独立服务器进行7.5折终身优惠促销,低至$93/月。所有服务器都是直连国内,速度上面相比欧洲、美国有明显的优势,特别适合建站、远程办公等多种用途。官方网站:https://www.bgp.to/dedicated.html主打日本(东京、大阪)、新加坡、香港(CN)、洛杉矶(US)的服务器业务!日本服务器CPU...
PacificRack在本月发布了几款特价产品,其中最低款支持月付仅1.5美元,基于KVM架构,洛杉矶机房,PR-M系列。PacificRack简称PR,QN机房旗下站点,主要提供低价VPS主机产品,基于KVM架构,数据中心为自营洛杉矶机房,现在只有PR-M一个系列,分为了2个类别:常规(Elastic Compute Service)和多IP产品(Multi IP Server)。下面列出几款秒...
backgroundworker为你推荐
建行手机网站怎么下载建行手机银行短信营销方案短信平台应该如何推广和运营啊?youtube创始人鬼步舞创作者是谁无处不在的意思人山无处不花枝的意思是什么pat是什么格式怎么将自己做的PS图片保存为PAT格式?pat是什么格式如何把JPG图片变为PAT格式图片?pat是什么格式pat是什么格式的文件啊pat是什么格式怎么能把常用格式的图片转换成PAT格式的呀~comexception电脑出现ConnectException: 是什么原因?gas是什么意思GC什么意思
租服务器价格 泛域名解析 sugarhosts 香港ufo 腾讯云盘 fdcservers mediafire cdn服务器 realvnc 12u机柜尺寸 徐正曦 泉州电信 免费防火墙 域名和空间 服务器干什么用的 太原网通测速平台 架设邮件服务器 smtp服务器地址 帽子云排名 秒杀品 更多