1

私はいくつかのデバッグ方法でwcfサービスを持っています:

public Result DebugMethod(TimeSpan time){
    Thread.Sleep(time);
    return new Result { Code = new Random().Next()};
}

同期呼び出しと非同期呼び出しの間のパフォーマンスをテストしたかったのです。

ResultをResponseクラスにパックしました。これには、mutexが結果を待機しています。

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つを同時に処理しています(1つのクライアントから)。

つまり、クライアントは4つの非同期呼び出しを行い、結果を待機しています。サーバーは最初の2つを処理し、次に1秒後、3番目と4番目を処理しています。

4

2 に答える 2

1

Did you check WCF limits and throttling? It is probably set to 2. Client OS's have a hard-coded limit of max. 10 that you cannot configure away.

于 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 に答える