11

我一直在网上阅读很多 WCF 文章,似乎大多数人缓存 ChannelFactory 对象而不是通道本身。似乎大多数人都害怕使用通道缓存,因为他们不想处理可能导致缓存通道不可用的网络故障。但这可以通过在方法上捕获 CommunicationException、重新创建通道并使用反射重播方法来轻松解决。

然后有些人认为进行通道缓存很糟糕,因为所有通信都将通过单个通道进行。请参阅以下文章。

http://social.msdn.microsoft.com/Forums/is/wcf/thread/9cbdf92a-a749-40ce-9ebe-3f2622cd78ee

这一定是坏事吗?你不能跨线程共享频道吗?性能会因为对这个单一通道的多个方法调用将被串行处理而受到影响吗?

我还没有发现共享频道会降低性能的证据。我确实发现使用缓存通道比使用非缓存通道快大约 5 倍,即使这意味着必须使用反射来对缓存通道进行方法调用。

另一个优点是,当您完成所有 WCF 调用时,不必使用 try/catch/finally 语句在通道上调用 Close()、Abort() 或 Dispose()。在我看来,WCF 似乎朝着错误的方向迈出了一步,迫使开发人员必须管理 WCF 通道资源。在 .NET Remoting 中,您使用 Activator 类创建了代理,您无需对它执行任何操作即可对其进行清理。.NET Framework 为您处理了所有这些。

4

1 回答 1

10

2个主要原因:

  1. ChannelFactory 的创建成本很高,而且它是线程安全的 => 完美的缓存候选者。
  2. 由通道工厂生成的通道创建起来并不昂贵,但它不是线程安全的(实际上它是线程安全的,但并发调用将被阻塞并按顺序执行)=> 不要在多线程环境中缓存它。

这是一篇不错的文章,其中包含更多详细信息。

于 2011-05-31T21:39:17.603 回答