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

}

有关Backgroundworker的更多相关文章

  1. C# BackgroundWorker 详解

    在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...

  2. 【Winform】使用BackgroundWorker控制进度条显示进度

    许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...

  3. C# 多線程&BackgroundWorker概念入門教程

    感謝以下各位作者的貢獻~ 百度經驗舉了個例子,很好理解BackgroundWorker的用途(主要是用來啟動後台線程,而不阻塞調用程式的運行),收藏一下  http://jingyan.baidu.c ...

  4. 【C#】【Thread】BackgroundWorker的使用

    BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork --当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递Do ...

  5. 用于异步的BackgroundWorker

    XAML代码: <Window x:Class="backgroundtest.MainWindow" xmlns="http://schemas.microsof ...

  6. C# 使用BackgroundWorker例子及注意点

    该例子为使用BackgroundWorker在TextBox文本中产生一个10000以内并且能被5整除的数(1秒产生一个) 操作界面可以启动线程,也可以停止线程,界面设计如图: 先贴代码,有注释的地方 ...

  7. C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...

  8. winform异步系统升级—BackgroundWorker

    BackgroundWorker用法实例 自己的代码,就是要执行的代码写到dowork里,ProgressChanged事件是控制进度时用的,最后的Completed事件进度完成,也就是dowork里 ...

  9. BackgroundWorker组件的作用

    当构建一个图形化的Windows Form桌面应用程序并且需要执行在应用程序主UI线程之外的线程中长时间的任务时,BackgroundWorker类就很有用了. 要使用BackgroundWorker ...

  10. C# BackgroundWorker的使用

    文章摘自:http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html BackgroundWorker 可以用于启动后台线程. 主要 ...

随机推荐

  1. windows系统JDK的安装及环境配置

    本文转载至:http://blog.csdn.net/sweetburden2011/article/details/8881181 一:JDK的安装 1.   首先上甲骨文公司的官方网站下载JDK的 ...

  2. PAT1021. Deepest Root (25)

    之前不知道怎么判断是不是树,参考了 http://blog.csdn.net/eli850934234/article/details/8926263 但是最后有一个测试点有超时,在bfs里我用了数组 ...

  3. UOJ132 【NOI2015】小园丁与老司机

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. hdu 5904 LCIS dp

    LCIS Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Des ...

  5. httpClient的post方法使用form格式数据调用接口

    Http使用post调用接口,接口只接受form表单数据格式问题? 这个问题的关键是form表单提交的是数据格式是什么样子的,使用httpClient工具类时Header信息如何写. 会影响解决问题思 ...

  6. 写hibernate.cfg.xml时报错The content of element type "property" must match "(meta*,(column|formula)*,type?)".

    原配置文件是这样的 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-ma ...

  7. 关于Javascript没有块级作用域和变量声明提升

    Javascript是没有块级作用域的,在语句块中声明的变量将成为语句块所在代码片段的局部变量.例如: if(true){ var x=3; } console.log(x); 结果输出3. 再如: ...

  8. css 单行和多行文本溢出显示省略号

    如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来,当然还需要加宽度width属来兼容部分浏览. 实现方法: overflow: hidden; te ...

  9. Respond.js的作用

    在html页面中我们经常看到 <!--[if lt IE 9]>    //判断当前浏览器的版本是否小于IE 9          <script src="https:/ ...

  10. cassandra 集群并发测试脚本

    prepare: create keyspace ycsb WITH REPLICATION = { }; USE ycsb; CREATE TABLE users ( firstname text, ...