WCF netTcpBinding 异步调用

Asynchronous call on WCF netTcpBinding

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

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

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

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

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 的限制吗?有解决办法吗?

终于明白了!

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

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

现在一切正常。