.NET框架基类库(BCL)中有好几种类都可以提供同步和异步的方法调用。不过,因为同步方法调用会导致程序流程中途等待,所以采用同步方法的情况下往往会导致程序执行的延迟,相比来说,在某些条件下选择异步方法调用就可能更好一些,例如,有的时候程序需要给多个Web服务发出请求,这时就最好采用异步方法。这篇文章的主旨就是向读者阐述如何用C#在.NET开发中采取异步方法调用。
同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果;而异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作。
为了说明异步方法调用所具有的优点,现在就让我们首先看一个例子,在这个例子中采用同步解决方案并不是最佳选择。这个例子要用到System.Net.Dns类。
同步版本的Resolve方法代码是如下定义的:
public static IPHostEntry Resolve(
string hostName
);
Resolve方法只接受一个参数hostName,hostName既可以是DNS名字(比如www.mydomain.com)也可以是点分十进制格式的IP地址(例如10.10.14.2)。Resolve方法只返回一个IPHostEntry对象。你可以通过IPHostEntry对象的成员来检索主机名、IP地址以及其他同特定主机有关的信息。
你能在自己的程序中使用Resolve同步方法,代码如下:
IPHostEntry host = Dns.Resolve(“10.10.14.2”);
Console.WriteLine(host.HostName);
这里有个问题,一旦调用了Dns.Resolve,你的程序就会被阻塞执行直到Resolve方法完成其名称解析任务并且返回一个IPHostEntry对象,这个过程可能会用去若干秒的时间。由于DNS 解析涉及到网络访问,所以这种方法调用完全可能受到包括网络延迟在内得推迟操作完成的因素的影响,所以在以上的情况下更适合于采用异步方法来获得同样的结果。
部件之间的异步通讯要采取以下的设计模式:程序必须能确定被调用方法已经完成任务的时刻或者能对其操作状态进行判断。这种设计模式允许程序获得方法返回的任何结果。所以说,在用到Web服务的时候,因为你的程序能在程序继续执行之前给多个Web服务同时发送请求然后等待各个方法返回各自的结果,所以异步设计在以上情况下特别有用。
在这种情形下,具有不同程度延迟的网络、各类公司通过因特网等等都可以提供程序用到的Web服务。因而,完成请求所需要的时间长度只受程序控制以外的若干因素影响。
在 .NET 框架内采用异步设计模式通常具有以下的特点,那就是要用到BeginXXXX和EndXXXX字样的方法,XXXX 在此表示该方法的同步版本的名字。现在就让我们仔细考察一下异步方法调用。