有关Backgroundworker
(一)Backgroundworker取消时应该用的有关代码:
CancelAsync方法是在前台主线程用的,CancellationPending属性是在后台子线程用的。实际的使用方式应该是这样的:
1.要取消异步操作,一般来说是在窗体中点击“取消”按钮,在“取消”按钮的单击事件中触发CancelAsync方法
private void btn_Stop_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync(); //提交取消命令,但还未取消
}
2.这时,CancellationPending由false变为true
3.再在DoWork事件里获取CancellationPending,依据它来处理后台任务,比如说直接return;
static void bw_DoWork(object sender, DoWorkEventArgs e)
{
//判断是否取消操作
if (bw.CancellationPending)
{
e.Cancel = true; //这里才真正取消
return;
}
}
4.最后完成时判断
static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
Console.WriteLine("You cancelled!");
else if (e.Error != null)
Console.WriteLine("Worker exception: " + e.Error.ToString());
else
{
Console.WriteLine("Complete - " + e.Result); // 从DoWork
}
}
(二)Backgroundworker相关代码:
一.开始
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
//在另一个线程里开始操作(btnStart是一个按钮控件)
//也可以利用RunWokerAsync()方法传递参数,
private void btnStart_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWokerAsync(2000/*参数是可选的*/);
}
//DoWork事件在另一个线程里执行
private void backgroundWorker1_DoWork(objectsender,DoWorkeventArgs e)
{
//允许长时间的操作
int input = (int)e.Argument;
Thread.Sleep(input);
}
二.显示后台操作进度
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.WorkerReportsProgress = true;
private void btnStart_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWokerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)
{
for (int i = 1; i < 11; i++)
{
Thread.Sleep(2000);
backgroundWorker1.ReportProgress(i*10);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//progressBar1是ProgressBar控件
progressBar1.Value = e.ProgressPercentage;
}
三.取消后台操作
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
private void btnStart_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWokerAsync();
}
private void btnCancel_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)
{
for (int i = 1; i < 11; i++)
{
Thread.Sleep(2000);
backgroundWorker1.ReportProgress(i*10);
if(backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
四.后台操作完成后,反馈给用户
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(e.Cancelled)
{
MessageBox.Show("Operation Cancelled");
}
else
{
MessageBox.Show("OperationCompleted");
}
}
五.从后台操作返回值
private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)
{
Thread.Sleep(2000);
//在此处设置返回值
e.Result = 10;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//在此处接收传递回来的值
intreturnValue = (int)e.Result;
}
最新文章
- .NET string字符串的截取、移除、替换、插入
- Sql Server之旅——第五站 确实不得不说的DBCC命令(文后附年会福利)
- 通过JavaScript操作HTML中select标签
- jquery获取radio和select选中值
- Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性
- hdu 2881 Jack&#39;s struggle(DP)
- javaWeb学习笔记
- AppServ 配置还是成功了
- jps 显示process information unavailable解决方法
- JavaScript 调试常见报错以及修复方法
- 《你必须知道的495个C语言问题》知识笔记及补充
- jquery 超简单的点赞效果
- petstore-jdbc
- Jmeter录制脚本工具之chrome插件--BlazeMeter
- MongoDB学习记录(二) - MongoDB的";增查改删";操作之";增";
- js控制随机数生成概率代码实例
- python数据结构与算法第十三天【归并排序】
- mangTomany 自关联之个人感悟
- Hive错误:Permission denied: user=anonymous, access=EXECUTE, inode=”/tmp”
- 【转】IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段
热门文章
- 【jsoi】第一季 [略]精简题解
- 深入理解Servlet3.0异步请求
- Tensorflow中的transpose函数解析
- 快速的熟悉一个angular的项目从run看起
- EF-局部更新
- Java 模拟ATM(修正)
- hbase_异常_04_util.FSUtils: Waiting for dfs to exit safe mode...
- 条款42:了解typename的双重含义
- 完成一个servlet 就要在web.xml里面配一个映射,这样就有一个路径供我们 使用????? servlet从页面接收值?
- linux下的第一个C程序及其编译方法