上一篇,我给大家介绍了“.NET1.0中基于IAsyncResult设计模式的异步编程模型(APM)”,它使用System.Threading命名空间的类来构造多线程应用程序。然而要想有效地使用这些工具类,需要有丰富的使用多线程软件工程的经验。对于相对简单的多线程应用程序,BackgroundWorker组件提供了一个简单的解决方案。对于更复杂的异步应用程序,可以考虑实现一个符合基于事件的异步模式的类。

  使用支持此模式的类,您将能够:

  1)异步执行耗时的任务。

  2)获得进度报告和增量结果。

  3)支持耗时任务的取消。

  4)获得任务的结果值或异常信息。

  5)更复杂:支持同时执行多个异步操作、进度报告、增量结果、取消操作、返回结果值或异常信息。

  为了实现基于事件的异步模式,我们必须先理解两个重要的帮助器类:

  AsyncOperationManager和AsyncOperation

  AsyncOperationManager类和AsyncOperation类是System.ComponentModel命名空间为我们提供了两个重要帮助器类。在基于事件的异步模式封装标准化的异步功能中,它确保你的异步操作支持在各种应用程序模型(包括 ASP.NET、控制台应用程序和 Windows 窗体应用程序)的适当“线程或上下文”调用客户端事件处理程序。

  AsyncOperationManager类和AsyncOperation类的API如下:
// 为支持异步方法调用的类提供并发管理。此类不能被继承。
public static class AsyncOperationManager 

    // 获取或设置用于异步操作的同步上下文。
    public static SynchronizationContext SynchronizationContext { get; set; } 
  
    // 返回可用于对特定异步操作的持续时间进行跟踪的AsyncOperation对象。
    // 参数:userSuppliedState:
    //     一个对象,用于使一个客户端状态(如任务 ID)与一个特定异步操作相关联。
    public static AsyncOperation CreateOperation(object userSuppliedState) 
    { 
        return AsyncOperation.CreateOperation(userSuppliedState,SynchronizationContext); 
    } 

  
// 跟踪异步操作的生存期。
public sealed class AsyncOperation 

    // 构造函数
    private AsyncOperation(object userSuppliedState, SynchronizationContext syncContext); 
    internal static AsyncOperation CreateOperation(object userSuppliedState 
                                            , SynchronizationContext syncContext); 
  
    // 获取传递给构造函数的SynchronizationContext对象。
    public SynchronizationContext SynchronizationContext { get; } 
    // 获取或设置用于标识异步操作的对象。
    public object UserSuppliedState { get; } 
  
    // 在各种应用程序模型适合的线程或上下文中调用委托。
    public void Post(SendOrPostCallback d, object arg); 
    // 结束异步操作的生存期。
    public void OperationCompleted(); 
    // 效果同调用 Post() + OperationCompleted() 方法组合
    public void PostOperationCompleted(SendOrPostCallback d, object arg); 
}

  先分析下这两个帮助器类:

  1、AsyncOperationManager是静态类。静态类是密封的,因此不可被继承。倘若从静态类继承会报错“静态类必须从 Object 派生”。(小常识,以前以为密封类是 sealed 关键字)

  2、AsyncOperationManager为支持异步方法调用的类提供并发管理,该类可正常运行于 .NET Framework 支持的所有应用程序模式下。

  3、AsyncOperation实例提供对特定异步任务的生存期进行跟踪。可用来处理任务完成通知,还可用于在不终止异步操作的情况下发布进度报告和增量结果(这种不终止异步操作的处理是通过AsyncOperation的 Post() 方法实现)。