异步编程:基于事件的异步编程模式(EMP)
作者:网络转载 发布时间:[ 2013/4/7 10:23:29 ] 推荐标签:
上一篇,我给大家介绍了“.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() 方法实现)。
相关推荐
更新发布
功能测试和接口测试的区别
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