EAP编程模型
1、EAP编程模型出现的原因
1.1、由于APM模型在异步处理的过程中,无法把异步处理的进度通知给别的线程,以及跨线程访问控件也会出现问题,所以就出现了EAP编程模型,这个模型在.Net 2.0的时候就以及出现了。
1.2、EAP编程模型可以有的功能
1)、异步执行耗时任务
2)、获取报告进度、增量的变化
3)、获取一些异步执行过程中的异常信息
4)、支持耗时异步的取消
5)、复杂的模型支持一般支持上面所有的功能
1.3、学习EAP模型需要的预备知识
1)、对是事件和委托的区别、联系要深入了解(否则看代码会晕)
2)、学会使用SynchronizationContext来访问控件、其实只要会使用其post方法和OperationCompleted方法
3)、了解微软提供两个帮助器类AsyncOperationManage和AsyncOperation
4)、了解下HybirdDictionary的用法和Dictronary用法几乎一样
5)、知道Component类的Events字段(EventHandlerList类型)
1.4、EMP模型就是更具1.3中的技术来实现了
2、介绍下帮助器类
2.1、AsyncOperationManager类和AsyncOperation类是在System.CompoentModel名称控件下的帮助器类。在基于事件的异步模型中会封装两个标准的帮助器类,这样可以确保你的操作
支持各种应用程序模型
2.2、AsyncOperationManager类
1 // 为支持异步方法调用的类提供并发管理。 此类不能被继承。 2 public static class AsyncOperationManager 3 { 4 // 获取或设置用于异步操作的同步上下文。 5 public static SynchronizationContext SynchronizationContext { get; set; } 6 // 一个对象,用于使一个客户端状态(如任务 ID)与一个特定异步操作相关联。 7 public static AsyncOperation CreateOperation(object userSuppliedState); 8 }
这是一个管理AsyncOperation的类,最常用的是使用CreateOperation方法创建一个AsyncOperation对象,其参数只有在允许多个异步操作的是时候使用,如果使用的话会把
userSuppliedState对象和AsyncOperation对象放在一个HybirdDictionary结构中,这样就可以通过userSuppliedState对象访问到其对于的AsyncOperation对象了。如果不适用可以将其设为null。
2.3、AsyncOperation类
1 // 跟踪异步操作的生存期。 2 public sealed class AsyncOperation 3 { 4 // 获取传递给构造函数的 SynchronizationContext 对象。 5 public SynchronizationContext SynchronizationContext { get; } 6 // 获取或设置用于唯一标识异步操作的对象。 7 public object UserSuppliedState { get; } 8 // 结束异步操作的生存期。 910 public void OperationCompleted(); 11 // 在适合于应用程序模型的线程或上下文中调用委托。 12 public void Post(SendOrPostCallback d, object arg); 13 // 结束异步操作的生存期。 14 public void PostOperationCompleted(SendOrPostCallback d, object arg); 15 }
在AsyncOperation类中,SynchornizationContext是在AsyncOperationManager类的CreareOperaation函数中获得。
Post函数调用的是SynchornizationContext对象的Post函数。作用是把委托派送到知道的线程的消息队列中去。
PostOperationCompleted函数调用的是SynchornizationContext对象的PostOperationCompleted函数。作用是结束异步操作
3、基于事件的异步模式的特征
3.1、基于事件的异步模式可以采用多种具体的设计根据不同模型的复杂度而定。
3.2、基于事件的异步模式可能有一下方法或事件
1)、***Async方法,一般用于异步过程进行控制。
2)、***Completed事件,一般用于异步过程完成之后触发的事件
3)、CancelAsync方法,用于取消异步操作
3)、ReportProgress方法用于触发ProcessChanged事件,这个主要用于进度的报告
4、BackgroundWorker组件模式,同一时刻只能运行一个异步操作。
5、可以运行多个异步操作的模型,
6、4、5模型都可以用上面介绍的知识点来构造
浙公网安备 33010602011771号