2012-12-06 67 views
1

我已經WCF服務的一些調試方法:WCF異步工作太久

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

我想測試同步和異步調用之間的性能。

我收拾好結果爲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次,每次用時間跨度= 1秒。 然後,在所有的異步調用之後,我正在檢查結果(只是等待它們)。

所以我認爲這將需要約1秒。 但所有這一切都需要5秒鐘。

如果我將呼叫次數更改爲n,則需要n/2秒才能獲得所有響應,例如可能只是針對在時間處理的異步任務。

編輯: 似乎所有的客戶端應用程序異步調用,但服務器同時處理(從一個客戶端)2。

因此: 客戶端做了4個異步調用並正在等待結果,服務器正在處理前兩個,然後是1秒後,第三個和第四個。

回答

1

您是否檢查過WCF限制和限制?它可能設置爲2.客戶端操作系統具有最大硬編碼限制。 10,你不能配置。

+0

所以我可以在不同的應用程序上同時運行它,但是在一個應用程序中,max是2? – Ari

+0

這是服務器端限制。這意味着客戶並不重要。您需要更改服務器上的設置。但是,如果你的服務器有一個客戶端操作系統,那麼你不能超過10個。這通常是開箱的情況。 – usr

+0

謝謝,明天我會試試,然後我會給予反饋。 – Ari

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;