【问题标题】:Create new ChannelFactory<T> when Faulted出现故障时创建新的 ChannelFactory<T>
【发布时间】:2011-06-03 05:05:16
【问题描述】:

当 ChannelFactory 进入故障状态时,以线程安全的方式重新创建 ChannelFactory 的最可靠方法是什么?这个场景有预期的并发性(为了争论,假设有 50 个并发客户端)。我想知道一些推荐的方法/想法/意见来实现这个目标(或替代方案)。

编辑:

使用@Ladislav Mrnka 的答案 - 似乎最可靠的方法是为 ChannelFactory 创建一个包装器。我最终这样做了,并公开了包装器的 CreateChannel 方法。

【问题讨论】:

  • Mhh,一个可能出现故障并具有通信状态的通道工厂对我来说似乎很奇怪。我会认为通信状态更多的是通道属性。一个可以翻倒的工厂似乎不是一个坚固的设计。
  • @ChrisWue - 我没有实现 ChannelFactory - 它是 .Net 框架的一部分,并具有从 .Net 框架中的 CommunicationObject 继承的 State 属性。并感谢您的反馈 - 我同意让 ChannelFactory 能够出错是一个不受欢迎的属性,这就是为什么我希望能够处理它以使其更健壮。

标签: c# multithreading wcf thread-safety channelfactory


【解决方案1】:

您认为该解决方案对您有何帮助?您将锁定该部分,以便只有一个线程可以进入该部分并检查 ChannelFactory 是否出现故障并重新创建它,但通道工厂的实例是共享的 - 您可以从属性中返回它:

  • 如果您进行检查并创建实例,则其他线程可以在此之后接收工厂并在您在初始线程中使用新工厂之前对其进行故障处理(竞争条件)。
  • 如果您重新创建故障工厂,所有其他已持有该引用的线程仍指向故障工厂。

因此,该解决方案将确保以线程安全的方式重新创建 ChannelFactory,但您仍然必须检查工厂是否在您想使用它的任何地方出现故障(这应该再次是线程安全的以确保可靠)。

我想可靠的方法是围绕ChannelFactory 创建包装器,并通过线程安全处理所有复杂性并检查包装器内的故障工厂。包装器将公开CreateChannel 方法和您需要的所有其他方法。您可以使用这样的包装器来管理多个工厂。

【讨论】:

  • 感谢@Ladislav 的宝贵反馈。我同意您的观点,它们是有道理的,并且使用包装器并从包装器返回创建的 Channel 代理,而不是允许其他线程持有对 ChannelFactory 的引用是要走的路。为了确保我理解正确-您的主要目的是实现包装器以确保调用者获得从无故障 ChannelFactory 创建的 Channel 代理(包装器负责实现在创建 Channel 时处理问题的逻辑,而不是访问包装器的调用者)?
【解决方案2】:

这两个 creating WCF ChannelFactory<T>What is the best workaround for the WCF client `using` block issue? 精彩的讨论帮助我建立了自己的防弹 WCF 服务。 我相信你也会从中受益匪浅。 两者都包括对您问题的直接回答:)

【讨论】:

  • 感谢您的反馈 - 这两个帖子中有很多很棒的信息。
猜你喜欢
  • 2012-12-08
  • 1970-01-01
  • 2020-11-07
  • 2021-05-30
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
相关资源
最近更新 更多