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

概述

在应用程序中,可能会遇到一些执行耗时的功能操作,比如数据下载、复杂计算及数据库事务等,一般这样的功能会在单独的线程上实现,执行结束后结果显示到用户界面上,这样可避免造成用户界面长时间无响应情况。在.NET 2.0及以后的版本中,FCL提供了BackgroundWorker组件来方便的实现这些功能要求。

组件介绍

BackgroundWorker 类位于System.ComponentModel 命名空间中,通过该类在单独的线程上执行操作实现基于事件的异步模式。下面对BackgroundWorker类的主要成员进行介绍。

BackgroundWorker 类的第1个主要方法是RunWorkerAsync,该方法提交一个以异步方式启动运行操作的请求,发出请求后,将引发 DoWork 事件,在事件处理程序中开始执行异步操作代码。RunWorkerAsync 方法签名如下,

public void RunWorkerAsync();

public void RunWorkerAsync(Object argument);

如果异步操作需要操作参数,可以将其作为argument参数提供,由于参数类型为Object,因此访问时可能需要进行类型转换。

CancelAsync 方法提交终止异步操作的请求,并将 CancellationPending 属性设置为 true。需要注意的是,CancelAsync 方法是否调用成功,同WorkerSupportsCancellation 属性相关,如果允许取消执行的异步操作,需将WorkerSupportsCancellation 属性设置为true,否则调用该方法将抛出异常。CancelAsync方法不含参数,方法签名如下,

public void CancelAsync();

调用 CancelAsync 方法时,BackgroundWorker的 CancellationPending 属性值将被设置为true,因此在编写单独线程中执行的辅助方法时,代码中应定期检查CancellationPending 属性,查看是否已将该属性设置为 true,如果为true,应该结束辅助方法的执行。有一点需要注意的是,DoWork 事件处理程序中的代码有可能在发出取消请求时已经完成处理工作,因此,DoWork事件处理程序或辅助方法可能会错过设置 CancellationPending属性为true的时机。在这种情况下,即使调用 CancelAsync方法发出了取消异步操作请求,RunWorkerCompleted 事件处理程序中RunWorkerCompletedEventArgs 参数的 Cancelled 标志也不会被设置为 true,这是在多线程编程中经常会出现的竞争条件问题,因此编写代码的时候需要考虑。

在执行异步操作时,如果需要跟踪异步操作执行进度,BackgroundWorker类提供了 ReportProgress 方法,调用该方法将引发 ProgressChanged 事件,通过注册该事件在事件处理程序中获取异步执行进度信息。方法签名如下:

public void ReportProgress(int percentProgress);

public void ReportProgress(int percentProgress,Object userState);

该方法包含两个版本,percentProgress表示进度百分比,取值为0-100,userState为可选参数表示自定义用户状态。

同CancelAsync 方法一样,BackgroundWorker的WorkerReportsProgress 属性设置为 true时,ReportProgress 方法才会调用成功,否则将引发InvalidOperationException异常。

上面已经提到了BackgroundWorker的3个属性,CancellationPending用来提示操作是否已经取消,WorkerReportsProgress和WorkerSupportsCancellation分别用来设置是否允许进度汇报和进行取消操作。

public bool CancellationPending { get; }

public bool WorkerReportsProgress { get; set; }

public bool WorkerSupportsCancellation { get; set; }

时间: 2024-12-03 11:32:11

使用BackgroundWorker组件进行异步操作编程的相关文章

《C#多线程编程实战(原书第2版)》——3.8 使用BackgroundWorker组件

3.8 使用BackgroundWorker组件 本节实例演示了另一种异步编程的方式,即使用BackgroundWorker组件.借助于该对象,可以将异步代码组织为一系列事件及事件处理器.你将学会如何使用该组件进行异步编程. 3.8.1 准备工作 为了学习本节,你需要安装Visual Studio 2015.除此之外无需其他准备.本节的源代码放置在BookSamples\Chapter3\Recipe7目录中. 3.8.2 实现方式 请执行以下步骤来学习如何使用BackgroundWorker组

VS2005中BackgroundWorker组件的使用经验

在VS2005中添加了BackgroundWorker组件,该组件在多线程编程方面使用起来非常方便,然而在开始时由于没有搞清楚它的使用机制,走了不少的弯路,现在把我在使用它的过程中的经验与诸位分享一下. BackgroundWorker类中主要用到的有这列属性.方法和事件: 重要属性: 1.CancellationPending 获取一个值,指示应用程序是否已请求取消后台操作.通过在DoWork事件中判断CancellationPending属性可以认定是否需要取消后台操作(也就是结束线程):

一个通过BackgroundWorker实现WinForm异步操作的例子

在最近的一个Smart Client项目中,为了演示异步操作的实现,写了一个基于BackgorundWorker的例子.由于这个理基本上实现了BackgorundWorker的大部分功能:异步操作的启动.操作结束后的回调.异步操作的撤销和进度报告等等.尽管没有太多的技术含量,姑且放上来与大家分享. 一.场景描述 下面是程序运行时的截图.本程序模拟这样的一个场景:有两组相互独立的数据需要逐条获取和显示,左边和右边两个groupbox分别代表基于这两组数据的操作,由于他们完全独立,因此可以并行执行.

backgroundworker组件的使用

本文转载:http://www.cnblogs.com/inforasc/archive/2009/10/12/1582110.html BackgroundWorker 组件用来执行诸如数据库事务.文件下载等耗时的异步操作. 开始 在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序: BackgroundWorker backgroundWorker1 = new BackgroundWorker(); 为了开始在后台操作,必须调用Backg

《Hadoop与大数据挖掘》一2.4.4 MapReduce组件分析与编程实践

2.4.4 MapReduce组件分析与编程实践 MapReduce整个流程包括以下步骤:输入格式(InputFormat).Mapper.Combiner.Partitioner.Reducer.输出格式(OutputFormat).这里会针对流程中的Combiner.Part-itioner.输入/输出格式进行分析,同时,也会介绍相关的编程技巧,如自定义键值对.1. Combiner分析 Combiner是什么呢?从字面意思理解,Combine即合并.其实,Combiner就是对Mapper

ASP.NET中WebForm组件CheckBoxList编程(4)

asp.net|web|编程 五. 文中源程序代码(Check.aspx)和执行的界面:       下图是执行了下列源程序代码(Check.aspx)后,生成的界面:             Check.aspx源程序代码如下:         <% @ Page Language = "C#" %>      <html >   <head >   <title > CheckBoxList组件演示程序 </title >

.NET组件控件实例编程系列——2.用Label控件模拟网页链接的组件

从本篇开始会通过实例介绍如何实现组件控件编程.在上一篇中提到通过组合实现组件编程,达到灵 活添加功能的效果.那么是如何组合的呢?一般是通过事件,在组件中处理控件的相关事件,在事件处理 程序中封装需要的功能. 本篇的实例是用Label模拟网页链接的效果.在.NET控件库中已经提供了LinkLabel控件,但该控件强 制显示下划线,而且只能改变链接颜色,不能改变背景色.这里通过处理Label控件的鼠标事件,动态改 变其显示相关属性,即可模拟出网页链接的效果.而且在事件中可以加入更多的效果,比Link

.NET组件控件实例编程系列——1.开篇

网上已经有很多关于组件和控件的文章了,我也是通过这些文章慢慢学会这些技术的.但那些文章主 要是教程式的,给的例子虽然简单容易理解,但针对实际应用的例子比较少.这里把我在工作和学习中做 过的组件和控件的实现方法贴出来,希望对初学者能有帮助.当然我的代码中也会存在不少问题,有些解 决方法也并不完美,希望看到的朋友不吝赐教. 首先把我之前参考的系列文章的链接贴出来,里面有比较详细的教程,对初学者帮助较大. .NET组件编程 http://www.cnblogs.com/mapserver/catego

C#基础学习 —— 异步编程篇 (二)

基于事件的异步模式是比 IAsyncResult 模式更高级的一种异步编程模式,也被用在更多的场合.对于相对简单的应用程序可以直接用 .Net 2.0 新增的 BackgroundWorker 组件来很方便的实现,对于更复杂的异步应用程序则需要自己实现一个符合基于事件的异步模式的类.这两者对我都是新东西,先从简单的入手,下一篇里我再去尝试复杂类模型的实现 模式概述 支持基于事件的异步模式的类会有若干个 MethodNameAsync 方法表示开始异步操作,并有对应的 MethodNameComp