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所示。
另外,关于IAsyncResult接口,需要说明的是,BeginInvoke方法的返回类型以及EndInvoke方法的唯一参数均为IAsyncResult接口类型,如下所示:
接下来介绍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;}
}