none
WCF异步服务实现的方式,但没有达到异步的效果,什么原因 RRS feed

  • 问题

  • 开发环境Visual studio 2010,部署在一台电脑上。

    • 契约:

        [ServiceContract(Name = "Center2Branches", Namespace = "http://www.sinobpo.com.cn/", SessionMode = SessionMode.Required)]
        public interface ICenter2Branches
        {
            //[OperationContract]
            //int Add(int a, int b);  
            [OperationContract(AsyncPattern = true)]
            IAsyncResult BeginAdd(int a, int b, AsyncCallback callBack, object stateObject);
            int EndAdd(IAsyncResult asynResult);

            ......

        }

    • 服务器端:

    采用的是netTcpBinding

    配置文件主要部分如下所示:

        <services>
          <service behaviorConfiguration="Center2BranchesBehavior" name="com.Sinobpo.WCFService.Services.Center2Branches">
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp://localhost:3434/" />
              </baseAddresses>
            </host>
            <endpoint address="" binding="netTcpBinding" bindingConfiguration="NetTcpBindingConfig" contract="com.Sinobpo.WCFService.Contracts.ICenter2Branches"/>
            <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
          </service>
        </services> 

    • 服务宿主:
                //创建宿主服务
                using (ServiceHost host = new ServiceHost(typeof(com.Sinobpo.WCFService.Services.Center2Branches)))
                {
                    Console.WriteLine("CalculaorService已经启动,按任意键终止服务!");
                    host.Open();
                    Console.Read();
                }

    • 客户端:

    通过“添加服务引用”来生成服务代理,配置文件自动生成。并运行如下代码:

                using (Center2BranchesClient client = new Center2BranchesClient("NetTcpBinding_Center2Branches"))
                {
                    Console.WriteLine("Begin to invocate calculator service via tcp transport ");
                        Thread thread = Thread.CurrentThread;
                        for (int i = 0; i < 20; i++)
                        {
                             Console.WriteLine("i + 3 = {0}", client.Add(i, 3));
                            Console.WriteLine("The thread id is {0}", client.ServiceAsync(thread.ManagedThreadId.ToString()));
                        }
                    }
                Console.Read();

    • 服务器端输出:

    虽然服务器端BegainAdd方法中,线程sleep了500毫秒,但程序依然等待add调用完毕并返回结果才继续向下执行。如下图是服务器端的输出


    2014年10月9日 1:18

全部回复

  • 在客户端一定要等到执行完Console.WriteLine("i + 3 = {0}", client.Add(i, 3));才继续执行                Console.WriteLine("The thread id is {0}", client.ServiceAsync(thread.ManagedThreadId.ToString()));

    那这样的异步有何意义呢?

    2014年10月9日 2:44