一、引言
在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式——APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题——不支持对异步操作的取消和没有提供对进度报告的功能,对于有界面的应用程序来说,进度报告和取消操作的支持也是必不可少的,既然存在这样的问题,微软当然也应该提供给我们解决问题的方案了,所以微软在.NET 2.0的时候就为我们提供了一个新的异步编程模型,也就是我这个专题中介绍的基于事件的异步编程模型——EAP。
实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步方法的取消、进度报告和报告结果。
当我们调用实现基于事件的异步模式的类的 XxxAsync方法时,即代表开始了一个异步操作,该方法调用完之后会使一个线程池线程去执行耗时的操作,所以当UI线程调用该方法时,当然也就不会堵塞UI线程了。
二、深入剖析BackgroundWorker组件类
在深入讲解BackgroundWorker类之前,让我们先看看BackgroundWorker类具有的成员和对应的介绍的(这里只列出一些在异步编程中经常使用的属性和方法,具体关于该类成员可以查看MSDN——BackgroundWorker):
|
BackgroundWorker类 |
|
|
公共属性 |
|
|
属性名 |
说明 |
|
CancellationPending |
获取一个值,指示应用程序是否已请求取消后台操作 |
|
IsBusy |
获取一个值,指示 BackgroundWorker是否正在运行异步操作。 |
|
WorkReportsProgress |
获取或设置一个值,该值指示 BackgroundWorker能否报告进度更新。 |
|
WorkerSupportsCancellation |
获取或设置一个值,该值指示 BackgroundWorker是否支持异步取消。 |
|
公共方法 |
|
|
名称 |
说明 |
|
CancelAsync |
请求取消挂起的后台操作。 |
|
ReportProgress |
引发 ProgressChanged 事件(官方这样解释我就要信?) |
|
RunWorkerAsync |
开始执行后台操作。 |
|
公共事件 |
|
|
名称 |
说明 |
|
DoWork |
调用 RunWorkerAsync 时发生(官方是这么解释的,你想知道为什么调用RunWorkerAsync方法就会触发DoWork事件吗?) |
|
ProgressChanged |
调用ReportProgress时发生(官方是这么解释的,你想知道为什么调用ReportProgress方法就会触发ProgressChanged事件吗?) |
|
RunWorkerCompleted |
当后台操作已完成、被取消或引发异常时发生。 |
分析为什么调用RunWorkerAsync方法就会触发DoWorker事件?
// RunWorkerAsync的源码什么都没有做,只是调用了该方法的重载方法RunWorkerAsync(objectargument)方法 publicvoidRunWorkerAsync() { this.RunWorkerAsync(null); }