异步编程:基于事件的异步编程模式(EMP)
作者:网络转载 发布时间:[ 2013/4/7 10:23:29 ] 推荐标签:
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对象从集合中删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11