我有一些调试方法的wcf服务:
public Result DebugMethod(TimeSpan time){
Thread.Sleep(time);
return new Result { Code = new Random().Next()};
}
我想测试同步和异步调用之间的性能。
我将Result打包到Response类中,它具有等待结果的互斥:
class Response {
public Result result;
bool loaded = false;
public ManualResetEvent _wait = new ManualResetEvent(false);
public Result get(){
if(!loaded){
_wait.WaitOne();
loaded = true;
}
return result;
}
我的DebugMethodCompleted事件:
//r - correct response structure, result - wcf response
r.result = result
r._wait.Set();
我正在调用DebugMethodAsync 10次,每次使用TimeSpan = 1秒。 然后,在所有异步调用之后,我正在检查结果(只是为了等待它们)。
所以我认为这需要大约1秒。 但所有时间都需要5秒。
如果我将调用次数更改为n,则需要花费n / 2 s才能获得所有响应,就像可能只是处理异步任务一样。
编辑: 似乎客户端应用程序中的所有异步调用都已建立,但服务器最多同时处理2个(来自一个客户端)。
所以: 客户端进行了4次异步调用并等待结果,服务器正在处理前两次,然后是1s。,第三次和第四次。
答案 0 :(得分:1)
您是否检查了WCF限制和限制?它可能设置为2.客户端操作系统的硬编码限制为最大值。 10你无法配置。
答案 1 :(得分:0)
需要做的事情很少。
首先,应该在服务器服务行为上设置ServiceThrottling。 可以进行多次并发呼叫以进行服务。
<behavior ...>
...
<serviceThrottling
maxConcurrentCalls="A"
maxConcurrentSessions="B"
maxConcurrentInstances="C"
/>
</behavior>
接下来,在clinet app上,应该设置System.Net.ServicePointManager.DefaultConnectionLimit。默认值为2。
// somewhere in the code
System.Net.ServicePointManager.DefaultConnectionLimit = X;