2012-03-26 49 views
3

我正在實施大量使用WCF服務的Silverlight應用程序,我現在已經到了現在的地步,偶爾會有幾個長時間的服務調用阻止其他服務調用運行。排隊服務調用

這些服務調用最終會超時。我想看看它是否有可能實現一個接一個地執行服務調用的隊列系統,這樣長時間的調用將阻止其他調用,但不會導致它們超時。

我使用代理服務包裹服務調用

public interface IExampleServiceAgent 
{ 
    void ProcessData(int a, string b, EventHandler<ProcessDataCompletedEventArgs> callback); 
} 


Public ExampleServiceAgent1 : IExampleServiceAgent 
{ 
    ExampleClient _Client = new ExampleClient(); 

    public void ProcessData(int anInt, string aString, EventHandler<ProcessDataCompletedEventArgs> callback) 
    { 
      EventHandler<ProcessDataCompletedEventArgs> wrapper = null; 
      wrapper = (a,b) => 
      { 
       callback(a,b); 
       _Client.ProcessDataCompleted -= wrapper; 
      } 
      _Client.ProcessDataCompleted += wrapper; 
      _Client.ProcessDataAsync(anInt,aString); 
    } 
} 

以上服務代理會再從代碼如下叫:

ServiceAgent.ProcessData(1,"STRING", (a,b) => 
{ 
    if (b.Error != null) 
    { 
     //Handle Error 
    } 
    else 
    { 
     //DO something with the data 
    } 
} 

有沒有一種方法,我可以把這些服務調用進入隊列並逐個執行?

我試過把它們包裝爲Actions並將它們添加到隊列中,但是這不會等待一個在啓動下一個之前完成執行,並且它們確實調用了服務,但沒有數據返回到調用ViewModel 。

+0

** **相反,我將專注於爲什麼這些電話這麼久,最後超時。也爲什麼他們導致**其他電話**超時。這並不自然。 – Aliostad 2012-03-26 12:49:33

+0

除了在客戶端添加一個隊列級別之外,您是否關注過關閉服務器端WCF服務的一些默認限制?僅當每個IP地址的2個連接限制或MaxConcurrentConnections限制處於默認狀態時纔會發生阻塞。如果您使用多個異步調用來訪問WCF,則IP地址限制是您的第一個問題。 – 2012-03-26 12:51:06

+0

某些通話需要很長時間的原因是他們必須處理大量數據。如果我碰巧同時收到2個慢速呼叫,則在慢速呼叫完成之前,所有其他呼叫都會超時。 @HiTechMagic是否有內置的WCF內部排隊以防止阻塞? – Midimatt 2012-03-26 13:04:43

回答

3

WCF服務可以應對大量的呼叫,但爲了避免拒絕服務攻擊,可以處理的請求數量默認是有限制的。

Silverlight的WCF服務的顯著限制將是

  • 來自同一IP地址2個同時呼叫的默認限制。
  • 約10-16個併發連接的限制(文檔因此而異)。

This CodeProject article on Quick Ways to Boost Performance and Scalability of ASP.NET, WCF and Desktop Clients was useful。

我猜你會立即觸及第一個問題。在您的WCF的配置,你需要添加下面以增加單個IP連接:

<system.net> 
    <connectionManagement> 
    <add address="*" maxconnection="100" /> 
    </connectionManagement> 
</system.net> 

然後你可以打第二個限制其解決方法是調整服務行爲,在web/app.config中的文件。

這裏有一些更多的參考,我發現而整理這些問題我自己:

+0

增加最大連接數已經停止了很好的超時,我將不得不對這些文章進行閱讀,看看是否還有其他可以使用的技巧。謝謝 – Midimatt 2012-03-28 09:21:22