25.3 IAsyncResult接口和AsyncResult类

要正确使用BeginInvoke和EndInvoke进行异步调用,就十分有必要了解和它们关系密切的两个类型:IAsyncResult接口和AsyncResult类。我们先来介绍一下其中的IAsyncResult接口,该接口定义了异步操作状态应该提供的属性。它的源代码如代码清单25-2所示。

代码清单25-2 IAsyncResult接口源代码


public interface IAsyncResult

{

//属性

object AsyncState{get;}

WaitHandle AsyncWaitHandle{get;}

bool CompletedSynchronously{get;}

bool IsCompleted{get;}

}


从上述代码可以看出,它共有4个属性,这些属性有一个共同点:都是只读属性。属性是一个十分重要的特性,它可以对字段的可访问性进行灵活定义。

接下来看看这四个属性分别具有什么含义,如表25-1所示。

25.3 IAsyncResult接口和AsyncResult类 - 图1

另外,关于IAsyncResult接口,需要说明的是,BeginInvoke方法的返回类型以及EndInvoke方法的唯一参数均为IAsyncResult接口类型,如下所示:

25.3 IAsyncResult接口和AsyncResult类 - 图2

接下来介绍AsyncResult类,它位于System.Runtime.Remoting.Messaging命名空间,实现了IAsyncResult接口,它的主要作用是封装了通过BeginInvoke进行异步调用的执行结果。但需要指出的是,BeginInvoke并非直接返回AsyncResult类型,而是返回IAsyncResult接口,但返回值可以显式地转换为AsyncResult类型。

AsyncResult类(源代码如25-3所示)有一个属性AsyncDelegate,该属性保存的是在其上进行异步调用的委托对象,只不过该属性返回的是object类型,需要显式转换为具体的委托类型。

代码清单25-3 AsyncResult类源代码


public class AsyncResult:IAsyncResult,IMessageSink

{

//属性,省略了字段和其他无关的方法成员

//实现IAsyncResult接口规定的属性成员

public virtual object AsyncState{get;}

public virtual bool CompletedSynchronously{get;}

public bool EndInvokeCalled{get;set;}

public virtual bool IsCompleted{get;}

//AsyncResult类自己的属性

public virtual WaitHandle AsyncWaitHandle{get;}

public virtual object AsyncDelegate{get;}

}