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();
        }
    }
}
时间: 2024-08-02 07:12:54

WCF的异步调用的相关文章

WCF初探-11:WCF客户端异步调用服务

前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码部分的执行,这时我们就需要考虑使用异步的方式来调用服务.注意这里的异步是完全针对客户端而言的,与WCF服务契约的方法是否异步无关,也就是在不改变操作契约的情况下,我们可以用同步或者异步的方式调用WCF服务. WCF客户端异步调用服务方式: 通过代理类异步调用服务.就需要通过使用事件驱动的异步调用模型

WPF异步调用WCF服务

wpf调用wcf时,第一次访问总耗时到达几秒,影响界面的用户体验,因此在wpf加载界面和加载数据时采用异步加载,即异步访问wcf服务, 由于是否采用异步加载和服务端无关,仅仅由客户端自己根据需要来选择,则我们只需要在客户端(WPF)程序中采用异步的方法.如下: //1.创建一个异步对象,访问wcfFunc<string, string, List<NodeItem>> GetDataFromWCF = new Func<string, string, List<Node

WCF系列教程之客户端异步调用服务

本文参考自http://www.cnblogs.com/wangweimutou/p/4409227.html,纯属读书笔记,加深记忆 一.简介 在前面的随笔中,详细的介绍了WCF客户端服务的调用方法,但是那些操作全都是同步的,所以我们需要很长的时间等待服务器的反馈,如何一台服务器的速度很慢,所以客户端得到结果就需要很长的时间,试想一下,如果客户端是个web项目,那么客户体验可想而知,所以为了不影响后续代码执行和用户的体验,就需要使用异步的方式来调用服务.注意这里的异步是完全针对客户端而言的,与

如何实现异步调用WCF

在面向服务的.NET开发中,我们经常要调用WCF服务加载数据,这时候,如果使用同步调用,会阻止UI,影响用户体验UE/UX,而且当服务器ping不通或者网速特别烂的情况下,这时候基本上是处于卡死状态,令人难以接受. 因此,实现一步调用WCF是.NET开发中一个必须的步骤.下面介绍如何实现一步调用WCF. 第一步:在WCF端建立一个WCF服务:WcfService,建立一个接口SumByTwoNumber,返回相加结果int: 第二步:在WPF端引用该WCF服务并实例化: WcfService.W

WCF跨域调用

1  WCf跨域调用  一个用 Jsonp  (这是蒋金楠大神写的一个实例这里把他拷贝过来) 在契约中 [ServiceContract] public interface IEmployees { [WebGet(UriTemplate = "all",ResponseFormat =WebMessageFormat.Json)] IEnumerable<Employee> GetAll(); } public class Employee { public string

客户端的异步调用

C#客户端的异步操作 阅读目录 开始 示例项目介绍 同步调用服务 异步接口介绍 1. 委托异步调用 2. 使用IAsyncResult接口实现异步调用 3. 基于事件的异步调用模式 4. 创建新线程的异步方式 5. 使用线程池的异步方式 6. 使用BackgroundWorker实现异步调用 客户端的其它代码 各种异步方式的优缺点 异步文件I/O操作 数据库的异步操作 异步设计的使用总结 在Asp.net中使用异步 上篇博客[用Asp.net写自己的服务框架] 我讲述了如何实现自己的服务框架,但

.Net 异步调用

.NET异步编程之新利器——Task与Await.Async 一.  FrameWork 4.0之前的线程世界    在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用实例方法Start()开启一个新线程,调用Abort()方法来提前终止线程. 使用System.Threading.ThreadPool类,调用静态方法QueueUserWorkItem(),将方法放入线程池队列,线程池来控制调用. 使用

(转)spring boot注解 [email&#160;protected] 异步调用

原文:http://www.cnblogs.com/azhqiang/p/5609615.html EnableAsync注解的意思是可以异步执行,就是开启多线程的意思.可以标注在方法.类上. 1 @Component 2 public class Task { 3 4 @Async 5 public void doTaskOne() throws Exception { 6 // 同上内容,省略 7 } 8 9 @Async 10 public void doTaskTwo() throws

CXF简单示例(二)之异步调用

在实际使用中,客户端在调用服务时,并不能及时得到响应,比如调用的服务本身是一个耗时费事的活,服务器破死命的跑,也只能在一分钟后才能够返回结果,这时候如果是同步的情况,那么客户端就必须在这里到等上一分钟,啥事不干.这肯定是不能容忍的,光吃饭不干活,再有这么好的事,请告诉我! OK,所以我们需要异步调用. 在这里,先介绍CXF提供的一个工具:WSDL2Java. 我们可以方便的利用它来生成相应的客户端接口,配置什么的脏活累活它都给我们干了,而我们只需要这样直接用就行了. 1. 获得服务的WSDL路径