我正在實施大量使用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 。
** **相反,我將專注於爲什麼這些電話這麼久,最後超時。也爲什麼他們導致**其他電話**超時。這並不自然。 – Aliostad 2012-03-26 12:49:33
除了在客戶端添加一個隊列級別之外,您是否關注過關閉服務器端WCF服務的一些默認限制?僅當每個IP地址的2個連接限制或MaxConcurrentConnections限制處於默認狀態時纔會發生阻塞。如果您使用多個異步調用來訪問WCF,則IP地址限制是您的第一個問題。 – 2012-03-26 12:51:06
某些通話需要很長時間的原因是他們必須處理大量數據。如果我碰巧同時收到2個慢速呼叫,則在慢速呼叫完成之前,所有其他呼叫都會超時。 @HiTechMagic是否有內置的WCF內部排隊以防止阻塞? – Midimatt 2012-03-26 13:04:43