c# - WCF netTcpBinding 异步调用

标签 c# wcf asynchronous

我在使用 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"/>

Result using basicHttpBinding

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

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

enter image description here

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

最佳答案

终于明白了!

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

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

现在它工作正常。

关于c# - WCF netTcpBinding 异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28117322/

相关文章:

java - 带参数的 Spring MVC 异步 Controller 实现

android - 在 Dagger 2 中异步构建依赖关系图

c# - 简单的正则表达式问题/多个匹配项

c++ - 如何将 C++ 程序连接到 WCF 服务?

javascript - 如何从异步调用返回响应?

Java 客户端无法使用 WCF 服务

json - WCF 休息大 json 错误

c# - 使此 LINQ 语句返回 T 而不是 Task<T>

c# - 在 Walther MFS100 支票扫描仪上检测到 CallbackOnCollectedDelegate

c# - 如何使用 SQL 查询 DataGridView?