【问题标题】:Asynchronous call on WCF netTcpBindingWCF netTcpBinding 上的异步调用
【发布时间】:2015-01-23 19:30:03
【问题描述】:

我在使用 netTcpBinding 时异步执行对 WCF 服务的调用时遇到问题。

例如。我有一个简单的服务,方法如下:

 public class Service1 : IService1
    {
        public string Calculate(int value)
        {
            Thread.Sleep(1000);
            return value.ToString();
        }
    }

在客户端,我通过异步调用该方法两次来测试它,并检查总时间。总时间应 > 1 秒且

static void Main(string[] args)
{
    var svc = new Service1Client();

    var dt = DateTime.Now;
    Console.WriteLine("Calculating 10..");
    var tsk1 = svc.CalculateAsync(10).ContinueWith(c=> Console.WriteLine ("Result of 10:.."  + c.Result.ToString()));

    Console.WriteLine("Calculating 20..");
    var tsk2 = svc.CalculateAsync(20).ContinueWith(c => Console.WriteLine("Result of 20:.." + c.Result.ToString()));

    Task.WaitAll(tsk1, tsk2);
    Console.WriteLine("Total Time: " + (DateTime.Now - dt).TotalMilliseconds.ToString());
}

好的。当我使用 basicHttpBinding 对其进行测试时,一切都很顺利:

<endpoint address="" binding="basicHttpBinding" name="svcEndpoint" contract="ServiceTest.IService1"/>

但是当使用netTcpBinding时,客户端等待第一次调用的结果执行第二次,使其同步

<endpoint address="" binding="netTcpBinding" name="svcEndpoint" contract="ServiceTest.IService1"/>

有人遇到过这样的问题吗?它是 netTcp 的限制吗?有解决办法吗?

【问题讨论】:

    标签: c# wcf asynchronous


    【解决方案1】:

    终于明白了!

    我需要通过属性ServiceBehaviour 明确告诉服务是并发的,如下所示:

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
     public class Service1 : IService1
        {
            public string Calculate(int value)
            {
                Thread.Sleep(1000);
                return value.ToString();
            }
        }
    

    现在一切正常。

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多