首页 > 代码库 > WCF的异步调用

WCF的异步调用

1.服务契约

namespace Contracts{    [ServiceContract]   public interface ICalculator    {        [OperationContract]       double Add(double x,double y);    }}

2.服务实现

namespace Services{   public class CalculatorService:ICalculator    {       public double Add(double x, double y)       {           return x + y;       }    }}

3.宿主程序

namespace Hosting{    class Program    {        static void Main(string[] args)        {                //通过配置文件获取相应的信息                using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))                {                                        host.Opened += delegate                    {                        Console.WriteLine("服务已经启动,按任意键停止");                    };                    host.Open();                    Console.Read();                }                    }    }}

4.服务配置文件

<configuration>  <system.serviceModel>    <behaviors>      <serviceBehaviors>        <behavior name="metadataBehavior">          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:6666/calculatorservice/metadata"/>        </behavior>      </serviceBehaviors>    </behaviors>    <services>      <service behaviorConfiguration="metadataBehavior" name="Services.CalculatorService">        <endpoint address="http://127.0.0.1:6666/calculatorservice" binding="wsHttpBinding" contract="Contracts.ICalculator"  ></endpoint>      </service>    </services>  </system.serviceModel></configuration>

5.添加服务引用

6.客户端调用(说明:利用异步方式执行服务操作,使得服务在执行过程中不会阻塞主线程,当方法执行完成后,通过AsyncCallback回调对应的方法,可以通知客户端服务执行完毕,从而使proxy.EndAdd()方法不会处于阻塞等待状态,而是等阻塞proxy.BeginAdd()执行完了再执行

namespace Client{    class Program    {        static void Main(string[] args)        {            //通过回调的方式进行异步服务调用            //通过上面的方式进行异步调用有一个不好的地方,就是当EndAdd方法被执行的时候            //如果异步执行的方法Add没有执行结束的话,该方法将会阻塞当前线程并等待异步            //方法的结束,这样往往不能起到多线程并发执行应有的作用。我么真正希望的是在            //异步执行结束后自动回调设定的操作,这样就可以采用回调的方式来实现这样的机制。            ServiceCalculator.CalculatorClient proxy = new Client.ServiceCalculator.CalculatorClient();            proxy.BeginAdd(1, 2, delegate(IAsyncResult asyncResult)            {double result = proxy.EndAdd(asyncResult);                proxy.Close();                Console.WriteLine("x+y={2} when x={0} and y={1}", operands[0], operands[1], result);            }, null);            Console.Read();        }    }}

 

WCF的异步调用