一、引言

  在上一个专题中为大家介绍了.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);

}
View Code

相关文章:

  • 2022-03-09
  • 2021-10-09
  • 2022-12-23
  • 2022-12-23
  • 2021-09-12
猜你喜欢
  • 2022-02-09
  • 2021-05-19
  • 2022-01-10
  • 2021-11-30
  • 2021-09-01
  • 2021-11-02
相关资源
相似解决方案