异步编程模型(APM)是.NET1.0的时候已经推出的古老异步编程模式,此模式基于IAsyncResult接口实现。

  随着技术的发展,又在“.NET1.0异步编程模型(APM)”之后推出了“.NET2.0基于事件的编程模式”及“.NET4.X基于任务的编程模式”两种异步编程模式。尽管在新的设计上我们推荐都使用“.NET4.0基于任务的编程模式”,但我还是计划整理出旧版的异步编程模型,因为:

  1、在一些特殊场合下我们可能觉得一种模式更适合;

  2、可以更充分认识三种模式之间的优劣,便于选择;

  3、很多遗留的代码包含了旧的设计模式;

  4、等等…

  示例下载:异步编程:IAsyncResult异步编程模型.rar

  IAsyncResult设计模式----规范概述

  使用IAsyncResult设计模式的异步操作是通过名为 Begin*** 和 End*** 的两个方法来实现的,这两个方法分别指代开始和结束异步操作。例如,FileStream类提供BeginRead和EndRead方法来从文件异步读取字节。这两个方法实现了 Read 方法的异步版本。

  在调用 Begin*** 后,应用程序可以继续在调用线程上执行指令,同时异步操作在另一个线程上执行。(如果有返回值还应调用 End*** 来获取操作的结果)。

  1)Begin***

  a)Begin*** 方法带有该方法的同步版本签名中声明的任何参数。

  b)Begin*** 方法签名中不包含任何输出参数。方法签名后两个参数的规范是:第一个参数定义一个AsyncCallback委托,此委托引用在异步操作完成时调用的方法。第二个参数是一个用户定义的对象。此对象可用来向异步操作完成时为AsyncCallback委托方法传递应用程序特定的状态信息(eg:可通过此对象在委托中访问End*** 方法)。另外,这两个参数都可以传递null。

  c)返回IAsyncResult对象。
// 表示异步操作的状态。 
[ComVisible(true)] 
public interface IAsyncResult 

    // 获取用户定义的对象,它限定或包含关于异步操作的信息。 
    object AsyncState { get; } 
    // 获取用于等待异步操作完成的System.Threading.WaitHandle,待异步操作完成时获得信号。 
    WaitHandle AsyncWaitHandle { get; } 
    // 获取一个值,该值指示异步操作是否同步完成。 
    bool CompletedSynchronously { get; } 
    // 获取一个值,该值指示异步操作是否已完成。 
    bool IsCompleted { get; } 

  
// 常用委托声明(我后面示例是使用了自定义的带ref参数的委托) 
public delegate void AsyncCallback(IAsyncResult ar)

  2)End***

  a)End*** 方法可结束异步操作,如果调用 End*** 时,IAsyncResult对象表示的异步操作还未完成,则 End*** 将在异步操作完成之前阻塞调用线程。

  b)End*** 方法的返回值与其同步副本的返回值类型相同。End*** 方法带有该方法同步版本的签名中声明的所有out 和 ref 参数以及由BeginInvoke返回的IAsyncResult,规范上 IAsyncResult 参数放后。

  i. 要想获得返回结果,必须调用的方法;

  ii. 若带有out 和 ref 参数,实现上委托也要带有out 和 ref 参数,以便在回调中获得对应引用传参值做相应逻辑;

  现在我们清楚了IAsyncResult设计模式的设计规范,接下来我们再通过IAsyncResult异步编程模式的三个经典场合来加深理解。