WCF异步工作时间太长

时间:2012-12-06 14:19:10

标签: wcf performance asynchronous

我有一些调试方法的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。,第三次和第四次。

2 个答案:

答案 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;