2009-12-17 65 views
4

我正在編寫一個使用WCF傳輸文件的應用程序。這些轉移是分段完成的,以便在任何不可預見的中斷後恢復。C#,WCF,何時重用客戶端代理

我的問題涉及到客戶端代理的使用,是否更好地保持它打開並重用它來傳輸每個文件段,或者我應該在每次我想發送一些內容時重新打開它?

回答

3

您可以重複使用您的WCF客戶端代理,這將使您的客戶端應用程序更快,因爲代理只會初始化一次。

+4

但是您需要小心,不要嘗試重複使用此策略時處於故障狀態的代理。 – Cocowalla 2009-12-17 10:12:31

+0

我的第一個想法是重用客戶端代理,但只是看看我們在這裏的其他一些應用程序中的使用情況,似乎有傾向儘快使用並關閉它們。儘管如此,沒有人能夠向我解釋。 會做科科瓦拉! – Andrew 2009-12-17 10:45:27

10

儘可能快地關閉代理的原因是,您可能正在建立綁定系統資源的會話(netTcpBinding使用傳輸級會話,wsHttpBinding可以使用安全性或基於可靠性的會話) 。

但是你是對的 - 只要客戶端代理不處於故障狀態,就可以完全重用它。

如果你想更進一步,如果你能共享服務器和客戶端之間的服務和數據契約共同組裝,你可以在客戶端創建代理分成兩個步驟:

  • 創建一個ChannelFactory<IYourServiceContract>一次並緩存 - 這是一個非常昂貴和資源密集型操作;因爲您需要使用您的服務合同(接口)來使其成爲通用的,所以您需要能夠在服務器和客戶端之間共享合同

  • 假設工廠,您可以根據需要使用factory.CreateChannel()創建您的渠道 - 此操作是更「重」,可以快速,一遍又一遍做

這是一個可能的優化,你可以考慮 - 因爲你控制通信的兩端的情況下,你可以分享合同服務器和客戶端之間的組裝

+0

謝謝你的這個想法,我看着它。 – Andrew 2009-12-17 16:10:28

1

如果您的系統需要良好的縮放比例,那麼創建新代理需要大約50-100毫秒的時間,這是相當長的一段時間。

重新使用代理時,必須注意其狀態線程問題。不要嘗試使用已經忙於發送數據的代理髮送數據。 (或接受)你會有可怕的不眠之夜。

重複使用的一種方法是,每次需要發送數據時,代理都有一個[ThreadStatic]專用字段,並測試其狀態爲&。如果創建了新線程,線程靜態字段將爲空,您需要創建一個代理。假設你有一個簡單的線程模型,這將保持不同的線程彼此踩腳趾,你只需要擔心代理的錯誤狀態。