(一)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;

}

最新文章

  1. .NET string字符串的截取、移除、替换、插入
  2. Sql Server之旅——第五站 确实不得不说的DBCC命令(文后附年会福利)
  3. 通过JavaScript操作HTML中select标签
  4. jquery获取radio和select选中值
  5. Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性
  6. hdu 2881 Jack&#39;s struggle(DP)
  7. javaWeb学习笔记
  8. AppServ 配置还是成功了
  9. jps 显示process information unavailable解决方法
  10. JavaScript 调试常见报错以及修复方法
  11. 《你必须知道的495个C语言问题》知识笔记及补充
  12. jquery 超简单的点赞效果
  13. petstore-jdbc
  14. Jmeter录制脚本工具之chrome插件--BlazeMeter
  15. MongoDB学习记录(二) - MongoDB的&quot;增查改删&quot;操作之&quot;增&quot;
  16. js控制随机数生成概率代码实例
  17. python数据结构与算法第十三天【归并排序】
  18. mangTomany 自关联之个人感悟
  19. Hive错误:Permission denied: user=anonymous, access=EXECUTE, inode=”/tmp”
  20. 【转】IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段

热门文章

  1. 【jsoi】第一季 [略]精简题解
  2. 深入理解Servlet3.0异步请求
  3. Tensorflow中的transpose函数解析
  4. 快速的熟悉一个angular的项目从run看起
  5. EF-局部更新
  6. Java 模拟ATM(修正)
  7. hbase_异常_04_util.FSUtils: Waiting for dfs to exit safe mode...
  8. 条款42:了解typename的双重含义
  9. 完成一个servlet 就要在web.xml里面配一个映射,这样就有一个路径供我们 使用????? servlet从页面接收值?
  10. linux下的第一个C程序及其编译方法