拼吾爱程序人生

首页 » .Net编程 » Visual Studio.NET » .Net中的异步编程模式 (APM) (二)
cobra - 2008-10-3 15:32:00
Note: 本篇主要内容来自Jeffery Richard的Implementing the CLR Asynchronous Programming Model,看过的同学可以略过。

前一篇中介绍了使用APM开发多线程程序的有点,同时关于如何使用APM方式的文章也很多了。所以,这篇主要想看看如何使用Jeffery Richard的Power Threading类库,来开发一个支持APM的类。
为什么要自己实现APM 前一篇中,提到了受计算约束(Computing-Bound)与受I/O约束(I/O-Bound)的区别。如果我们是一个受计算约束类型的任务,完全可以将这个方法变成委托(Delegate)的形式,然后通过BeginInvoke/EndInvoke来实现APM;另外,FCL本身也封装了大量对I/O异步操作的类,如FileStream,NetworkStream等,那我们为什么还要自己实现APM呢。Jeffery Richard列举了4个原因:

PowerThreading类库中的AsyncResult和AsyncResult<T> APM的核心就是IAsyncResult接口。当调用类异步方式BeginXxx时,返回IAsyncResult的对象。为了返回满足这个接口的对象,我们的类需要维护的一个 是否完成的状态IsCompleted;一个ManuelResetEvent对象及一个委托保持回调函数。这些虽然比较简单,但很麻烦。使用PowerThreading类库中AsyncResult和AsyncResult<T>,我们可以非常容易的实现支持APM的类。

AsyncResult用于没有返回值,而AsyncResult<T>用于返回类型为T的任务。下面的例子中,我们看看如何使用AsyncResult<T>。

首先,我们准备实现一个能够过滤Stream对象的类,类定义如下:


Code



Parse()是同步访问接口,执行主要的任务,而BeginParse()和EndParse()是对应的异步接口。下面是使用AsyncResult<T>后的代码


Code




比较重要的是ParseHelper函数,这个函数在新的线程中执行,通过ar.SetAsCompleted来更新状态。 如果结合匿名方法或者Limbda表达式,代码可以变得更加的紧凑。

参考:
Implementing the CLR Asynchronous Programming Model by Jeffery Richard
Power Threading类库



(文/Nullnoid  出处/博客园)

 您可能对 [Visual Studio.NET] 的这些文章也感兴趣:

.NET组件和COM组件之间的相互操作
Invoke and BeginInvoke
NServiceBus——让创建企业级.NET系统更加容易
利用宏让ERStudio生成代码文件
在中文版VS 08中安装MVC
XNA Primitives画线 2(3D空间)
Visual Studio 2008 对jQuery实现智能感知提示
使用Visual Studio 2010从分析到实施(1)——安装Visual Studio 2010 CTP2
Framework Design Studio发布
BlogEngine.Net架构与源代码分析系列part11:开发扩展(下)——自定义Theme
1
查看完整版本: .Net中的异步编程模式 (APM) (二)
Modify by pin5i DZNT_ExpandPackage 2.1.3258 2007-2008 pin5i.com