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();
}
}
现在一切正常。
我在使用 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();
}
}
现在一切正常。