关闭

异步编程:基于事件的异步编程模式(EMP)

发表于:2013-4-07 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:滴答的雨    来源:51Testing软件测试网采编

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

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

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

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

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

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

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

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

  AsyncOperationManager和AsyncOperation

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

  AsyncOperationManager类和AsyncOperation类的API如下:

  1. // 为支持异步方法调用的类提供并发管理。此类不能被继承。 
  2. public static class AsyncOperationManager  
  3. {  
  4.     // 获取或设置用于异步操作的同步上下文。 
  5.     public static SynchronizationContext SynchronizationContext { get; set; }  
  6.    
  7.     // 返回可用于对特定异步操作的持续时间进行跟踪的AsyncOperation对象。 
  8.     // 参数:userSuppliedState: 
  9.     //     一个对象,用于使一个客户端状态(如任务 ID)与一个特定异步操作相关联。 
  10.     public static AsyncOperation CreateOperation(object userSuppliedState)  
  11.     {  
  12.         return AsyncOperation.CreateOperation(userSuppliedState,SynchronizationContext);  
  13.     }  
  14. }  
  15.    
  16. // 跟踪异步操作的生存期。 
  17. public sealed class AsyncOperation  
  18. {  
  19.     // 构造函数 
  20.     private AsyncOperation(object userSuppliedState, SynchronizationContext syncContext);  
  21.     internal static AsyncOperation CreateOperation(object userSuppliedState  
  22.                                             , SynchronizationContext syncContext);  
  23.    
  24.     // 获取传递给构造函数的SynchronizationContext对象。 
  25.     public SynchronizationContext SynchronizationContext { get; }  
  26.     // 获取或设置用于唯一标识异步操作的对象。 
  27.     public object UserSuppliedState { get; }  
  28.    
  29.     // 在各种应用程序模型适合的线程或上下文中调用委托。 
  30.     public void Post(SendOrPostCallback d, object arg);  
  31.     // 结束异步操作的生存期。 
  32.     public void OperationCompleted();  
  33.     // 效果同调用 Post() + OperationCompleted() 方法组合 
  34.     public void PostOperationCompleted(SendOrPostCallback d, object arg);  
  35. }

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

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

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

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

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号