1

我有一些调试方法的 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 秒才能获得所有响应,就像有时可能只是异步任务处理一样。

编辑:似乎客户端应用程序中的所有异步调用都已进行,但服务器同时处理多达 2 个(来自一个客户端)。

所以:客户端进行了 4 次异步调用并正在等待结果,服务器正在处理前两个,然后,在 1 秒之后,第三个来回。

4

2 回答 2

1

您是否检查过 WCF 限制和限制?它可能设置为 2。客户端操作系统的硬编码限制为最大值。10,您无法配置。

于 2012-12-06T17:30:10.523 回答
0

需要做的事情很少。

首先,应在服务器服务行为上设置 ServiceThrottling。可以对服务进行许多并发调用。

<behavior ...>
    ...
    <serviceThrottling
        maxConcurrentCalls="A"
        maxConcurrentSessions="B"
        maxConcurrentInstances="C"
    />
</behavior>

接下来,在 clinet 应用程序上,应设置 System.Net.ServicePointManager.DefaultConnectionLimit。默认值为 2。

// somewhere in the code
System.Net.ServicePointManager.DefaultConnectionLimit = X;
于 2012-12-07T10:53:37.877 回答