4、AsyncOperation类有一个私有的构造函数和一个内部CreateOperation() 静态方法。由AsyncOperationManager类调用AsyncOperation.CreateOperation() 静态方法来创建AsyncOperation实例。

  5、AsyncOperation类是通过SynchronizationContext类来实现在各种应用程序的适当“线程或上下文”调用客户端事件处理程序。
// 提供在各种同步模型中传播同步上下文的基本功能。 
public class SynchronizationContext 

    // 获取当前线程的同步上下文。 
    public static SynchronizationContext Current { get; } 
  
    // 当在派生类中重写时,响应操作已开始的通知。 
    public virtual void OperationStarted(); 
    // 当在派生类中重写时,将异步消息调度到一个同步上下文。 
    public virtual void Post(SendOrPostCallback d, object state); 
    // 当在派生类中重写时,响应操作已完成的通知。 
    public virtual void OperationCompleted(); 
    …… 
}

  a)在AsyncOperation构造函数中调用SynchronizationContext的OperationStarted() ;

  b)在AsyncOperation的 Post() 方法中调用SynchronizationContext的Post() ;

  c)在AsyncOperation的OperationCompleted()方法中调用SynchronizationContext的OperationCompleted();

  6、SendOrPostCallback委托签名:
// 表示在消息即将被调度到同步上下文时要调用的方法。 
public delegate void SendOrPostCallback(object state);

  基于事件的异步模式的特征

  1、基于事件的异步模式可以采用多种形式,具体取决于某个特定类支持操作的复杂程度:

  1)简单的类可能只有一个 ***Async方法和一个对应的 ***Completed 事件,以及这些方法的同步版本。

  2)复杂的类可能有若干个 ***Async方法,每种方法都有一个对应的 ***Completed 事件,以及这些方法的同步版本。

  3)更复杂的类还可能为每个异步方法支持取消(CancelAsync()方法)、进度报告和增量结果(ReportProgress() 方法+ProgressChanged事件)。

  4)如果您的类支持多个异步方法,每个异步方法返回不同类型的数据,您应该:

  a)将您的增量结果报告与您的进度报告分开。

  b)使用适当的EventArgs为每个异步方法定义一个单独的 ***ProgressChanged事件以处理该方法的增量结果数据。

  5)如果类不支持多个并发调用,请考虑公开IsBusy属性。

  6)如要异步操作的同步版本中有 Out 和 Ref 参数,它们应做为对应 ***CompletedEventArgs的一部分,eg:
public int MethodName(string arg1, ref string arg2, out string arg3); 
  
public void MethodNameAsync(string arg1, string arg2); 
public class MethodNameCompletedEventArgs : AsyncCompletedEventArgs 

    public int Result { get; }; 
    public string Arg2 { get; }; 
    public string Arg3 { get; }; 
}

  2、如果你的组件要支持多个异步耗时的任务并行执行。那么:

  1)为***Async方法多添加一个userState对象参数(此参数应当始终是***Async方法签名中的后一个参数),用于跟踪各个操作的生存期。

  2)注意要在你构建的异步类中维护一个userState对象的集合。使用 lock 区域保护此集合,因为各种调用都会在此集合中添加和移除userState对象。

  3)在***Async方法开始时调用AsyncOperationManager.CreateOperation并传入userState对象,为每个异步任务创建AsyncOperation对象,userState存储在AsyncOperation的UserSuppliedState属性中。在构建的异步类中使用该属性标识取消的操作,并传递给CompletedEventArgs和ProgressChangedEventArgs参数的UserState属性来标识当前引发进度或完成事件的特定异步任务。

  4)当对应于此userState对象的任务引发完成事件时,你构建的异步类应将AsyncCompletedEventArgs.UserState对象从集合中删除。