2010-09-08 53 views
3

這是在Silverlight中關閉與WCF的連接的正確方法嗎?在Silverlight中使用WCF CloseAsync

ServiceClient client = new ServiceClient(); 

     client.MakeRequestCompleted += (sender, e) => 
      { 
       client.CloseAsync(); 

       //some implementation goes here 
      }; 

     for (int i = 0; i < 1000; i++) 
     { 
      client.MakeRequestAsync(); 
     } 

我似乎有與併發連接有關的問題,當循環達到它提出約300請求時,它只是失敗。謝謝。

回答

0

我不是專家,但我一直在研究類似的問題,並沒有其他人留下了一個答案...

你關閉你的客戶不保證您的操作,使1000調用Web服務有完了。我還發現在CloseAsync方法中找到文檔有點困難,但在您完成所有Web服務調用後,accepted wisdom似乎要撥打CloseAsync

另外,在您的應用中創建千次的Web服務調用可能很危險 - 顯然我不知道您的情況來龍去脈,但將您的調用結合到更少,更大的操作中可能會更好。

+0

我看到一個在線實現,建議在已完成的事件中添加「(e作爲ServiceClient).CloseAsync()」,從此開始工作。我相信每個異步調用都是與Web服務的唯一連接,它會自動關閉,但不會立即關閉,從而造成導致Web服務請求失敗的瓶頸。如果在完成的事件中關閉每個連接,則可以防止出現瓶頸。 – Bablo 2010-10-12 11:38:07

+0

是的,這就是我通常這樣做的方式,但是他爲1000個併發操作使用了一個客戶端對象。誰知道會發生什麼? – 2010-10-12 12:14:48

0

此引用說,你不必關閉請求: http://forums.silverlight.net/forums/p/29299/95656.aspx


1: ServiceClient client = new ServiceClient(); 
2: client.MakeRequestCompleted += (sender, e) =>... 
3: client.MakeRequestAsync(); 

MakeRequestCompleted是一個代表。請求完成後,將執行呼叫。

如果您讓第1行和第2行對於所有請求都是公共的,則您已將具有相同參數的相同事件綁定到每個請求。然後在你的實現代碼中,你不知道哪個調用導致了哪個事件。 [1]

如果您嘗試製作一條常見的線條,您將會有越來越多的活動,並且您無法真正以線程安全方式取消訂閱。

那麼,如果您只是爲每個請求製作所有這些行,您是否可以測試多少性能?

for (int i = 0; i < 1000; i++) 
{ 
    ServiceClient client = new ServiceClient(); 
    client.MakeRequestCompleted += (sender, e) =>... 
    client.MakeRequestAsync(); 
} 

(那麼你當然應該使用緩存並使用更少的請求。)


[1]:如果你建立只是一個「錘客戶端」像這樣的,這可能是好的,但是如果你需要一些真正的實現,常見的事件參數可能不夠。