2011-06-03 63 views
1

當進入故障狀態時,以線程安全方式重新創建ChannelFactory <T>的最可靠方法是什麼?這種情況有預期的併發性(爲了爭論起見,假設50個併發客戶端)。我想知道一些爲實現這一目標(或替代方案)而提出的建議方法/想法/意見。當出現故障時,創建新的ChannelFactory <T>

編輯:

使用@Ladislav Mrnka的答案 - 它似乎是最可靠的方法來完成,這是創建一個包裝了的ChannelFactory <牛逼>。我最終這樣做了,並且暴露了包裝器的CreateChannel方法。

+0

感謝您的編輯@dtb。 – dugas 2011-06-03 05:09:45

+1

Mhh,一個可以故障並具有通信狀態的渠道工廠對我來說似乎很奇怪。我會將通信狀態視爲頻道屬性。一個可以倒下的工廠似乎不是一個堅固的設計。 – ChrisWue 2011-06-03 07:52:53

+1

@ChrisWue - 我沒有實現ChannelFactory - 它是.Net框架的一部分,並且具有從.Net框架中的CommunicationObject繼承的State屬性。感謝您的反饋意見 - 我同意讓ChannelFactory能夠發生故障是一個不受歡迎的屬性,這就是爲什麼我希望能夠處理它以使其更加健壯。 – dugas 2011-06-04 01:13:46

回答

4

您認爲該解決方案對您有何幫助?您將鎖定部分,以便只有一個線程可以進入該部分並檢查是否ChannelFactory出現故障並重新創建它,但對於通道工廠的實例分享的 - 你從屬性,因此其返回:

  • 如果您檢查並創建實例,其他線程可以在此之後接收工廠,並在初始線程(競爭條件)中使用新工廠之前對其進行故障排除。
  • 如果您重新創建故障工廠,則所有其他已經保存引用的線程仍指向故障工廠。

因此該解決方案將確保ChannelFactory是線程安全的方式重現,但你仍然要檢查工廠的任何地方發生故障,你想用它(這應該又是線程安全的,可靠) 。

我想可靠的方法是圍繞ChannelFactory創建包裝並處理所有複雜的線程安全問題,並檢查包裝內的錯誤工廠。包裝會暴露CreateChannel方法和您需要的所有其他方法。您可以使用這種包裝來管理多個工廠。

+0

感謝@Ladislav提供的寶貴意見。我同意你的觀點,他們是有道理的,並且使用包裝器並從包裝中返回創建的Channel代理,而不是讓其他線程持有對ChannelFactory的引用是一條路。爲了確保我的理解正確 - 你的主要觀點是實現包裝器以確保調用者獲得從無故障的ChannelFactory創建的Channel代理(包裝器負責實現創建渠道時處理問題的邏輯,而不是訪問包裝的調用者)? – dugas 2011-06-04 01:25:16

+0

是的,這就是我的意思。 – 2011-06-04 06:07:16

相關問題