本文转载:http://www.cnblogs.com/inforasc/archive/2009/10/12/1582110.html

BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作。

开始

在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序:

BackgroundWorker backgroundWorker1 = new BackgroundWorker();

为了开始在后台操作,必须调用BackgroundWorker的RunWorkerAsync()方法,当调用此方时,BackgroundWorker 通过触发DoWork 事件,开始执行后台操作,DoWork 事件的代码是在另一个线程里执行的。代码如下:

代码一:

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

}

显示后台操作进度

为了显示后台操作的执行进度,首先要使WorkerReportsProgress 等于true,然后调用BackgroundWorker的ReportProgress()方法,通过它传递操作完成的进度值,此外,该方法触发ProgressChanged事件,在是此事件中,通过ProgressChangedEventArgs的实例,接收到主线程传递过来的参数。

代码二:

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 可以取消后台正在执行的操作,首先要把属性WorkerSupportsCancellation 的值设置为 true。接着调用CancelAsync()方法,该方法使得属性CancellationPending 为true,利用CancellationPending 属性,可以判断是否取消后台异步操作。

代码三:

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;

}

后台操作完成后,反馈给用户

当后台操作完成以后,无论是completed 还是cancelled,则RunWorkerCompleted 事件被触发,通过此方法可以将后台操作的完成结果反馈给用户;

另外,通过RunWorkerCompletedEventArgs实例的Cancelled 属性,以判断是否是Cancel操作使得后台操作终止;

代码片段:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

if(e.Cancelled)

{

MessageBox.Show("Operation Cancelled");

}

else

{

MessageBox.Show("OperationCompleted");

}

}

从后台操作返回值

在执行DoWork 事件时,DoWorkEventArgs 实例的Result 属性,返回值到用户;在RunWorkerCompleted 事件里,RunWorkerCompletedEventArgs 实例的Result 属性接收值;

代码片段:

private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)

{

Thread.Sleep(2000);

//在此处设置返回值

e.Result = 10;

}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

//在此处接收传递回来的值

int returnValue = (int)e.Result;

}

backgroundworker组件的使用的更多相关文章

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

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

  2. BackgroundWorker组件

    BackgroundWorker组件封装了后台线程的操作,并且直接利用线程池,无需自己管理线程池等复杂问题. 它主要适用于 比如界面后台加载数据,进度显示,上传下载文件,日月结等 这些都是繁重的劳动, ...

  3. BackgroundWorker组件学习

    今天看到别人的博客中提到了BackgroundWorker组件.在现在的系统中有见到过这个组件,由于实际应用的系统中逻辑比较复杂所以也没深入去看.今天凑巧看到了一个关于BackgroundWorker ...

  4. 使用BackgroundWorker组件进行异步操作编程

    本文介绍了BackgroundWorker组件的功能及在基于事件的异步操作编程中的应用,并对组件的实现原理进行简述.在应用程序中,可能会遇到一些执行耗时的功能操作,比如数据下载.复杂计算及数据库事务等 ...

  5. BackgroundWorker组件使用总结

    首先在窗体拖入一个BackgroundWorker组件,根据功能需要设置BackgroundWorker的属性 WorkerSupportsCancellation = true; 允许取消后台正在执 ...

  6. C# BackgroundWorker组件学习

    C# BackgroundWorker组件学习  C# BackgroundWorker组件学习 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用Ba ...

  7. C# Winform backgroundWorker组件使用

    BackgroundWorker 组件用来执行诸如数据库事务.文件下载等耗时的异步操作. 开始 在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序: ...

  8. 使用BackgroundWorker组件

    BackgroundWorker 组件用来执行诸如数据库事务.文件下载等耗时的异步操作. 开始 在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序: ...

  9. BackGroundWorker组件使用、Winform控件的Invoke安全调用

    BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作. 可以通过编程方式创建 BackgroundWorker,也可以将它从"工具 ...

随机推荐

  1. shell调用shell

    在默认条件下,执行shell文件会出现permission denied报错,一般是没有可执行权限.用chmod修改权限 chomd 777 score.sh   //把所有权限给aa文件 777代表 ...

  2. Oracle数据库之PL/SQL触发器

    Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...

  3. 再次深入理解delphi的类

    property WindowState: TWindowState read FWindowState write SetWindowState; {声明一个属性WindowState,它从字段FW ...

  4. [Windows] php开发工具,zendstudio13使用方法补丁

    官网原版下载 http://downloads.zend.com/studio ... win32.win32.x86.exe 破解补丁: 链接:http://pan.baidu.com/s/1gdi ...

  5. python【第三篇】函数

    内容大纲: 1.函数基本语法与特性 2.参数与局部变量 3.返回值 4.递归 5.匿名函数lambda 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数基本语法与特性 函数的定义:函数是指将一 ...

  6. javascript定义类的方法总结

    1.构造函数法 类是对象的模板,定义了对象共有的方法属性数据 等,在javascript中一个函数就是一个对象,也可以看做一个类的构造方法. 所以我们可以像以下方式定义类: //1.经典的构造方法 Q ...

  7. 解决JsonFormat日期少一天问题

    使用Jackson的@JsonFormat注解时出现少一天 比如数据库存的日期是2015-01-05,转成json则变成了2015-01-04 解决办法: @JsonFormat(pattern=&q ...

  8. 最好用的手机编程软件-C4droid

    Q:c4droid是什么? A:c4droid(以下简称c4)是安卓平台上最强大的c/c++ 编译器,你可以在手机上用手机编写自己的C/C++程序,并且可以把程序导出成apk文件. 下载地址:http ...

  9. linux直接启动到字符界面或从字符界面启动到图形化界面

    修改/etc/inittab文件 将内容为:"id:5:initdefault"的行的数字5改为3,保存重启即可直接进入字符界面 PS:3和5分别表示运行级别 从字符界面启动到图形 ...

  10. hibernate 多对一的情况

    <?xml version="1.0" encoding="GBK"?> <!DOCTYPE hibernate-mapping PUBLIC ...