C# 单WCF信道性能与多信道性能

C# 单WCF信道性能与多信道性能,c#,wcf,C#,Wcf,我有一个应用程序,它一次又一次地重用同一个WCF通道。我通过工厂对象保持静态引用。我想知道这是一个好的做法,还是我应该打开x个频道,并通过这些频道循环所有服务呼叫,而不是使用单一频道 如果只使用1个通道,这些服务调用会排队吗?或者当我使用x个通道时,会发生同样的情况吗?您应该为所有请求使用一个通道工厂,但应为每个请求构造不同的通道。永远不要重复使用频道。它们的创建成本不高,而且线程也不安全。创建渠道工厂的成本很高。它是线程安全的,可以重用。当然,如果通道工厂进入故障状态,您可能需要重新打开它。@

我有一个应用程序,它一次又一次地重用同一个WCF通道。我通过工厂对象保持静态引用。我想知道这是一个好的做法,还是我应该打开x个频道,并通过这些频道循环所有服务呼叫,而不是使用单一频道


如果只使用1个通道,这些服务调用会排队吗?或者当我使用x个通道时,会发生同样的情况吗?

您应该为所有请求使用一个通道工厂,但应为每个请求构造不同的通道。永远不要重复使用频道。它们的创建成本不高,而且线程也不安全。创建渠道工厂的成本很高。它是线程安全的,可以重用。当然,如果通道工厂进入故障状态,您可能需要重新打开它。

@Darin Dimitrov

重用同一代理 在许多情况下,您可能希望重用同一个代理。这是性能最好的。当您使用安全特性时尤其如此,因为初始安全协商可能会有很高的成本

代理等于通道。如果查看,可以看到以下代码段:

ISimpleContract proxy = factory.CreateChannel();
((IClientChannel)proxy).Open();

此外,如果计划使用会话,则不希望为每个请求建立新会话(每次创建一个新的通道/代理)。

因此,保留由_channelFactory.CreateChannel()返回的ICommunicationObject不是一个好主意?我现在为所有请求打开一个通道,我不会对每个调用都执行_channelFactory.CreateChannel(),我会重用第一次创建的静态通道。@Bjorn bailluel,这不是一个好主意。
\u channelFactory.CreateChannel()
返回的实例应该尽可能短,并且永远不能重复使用。正如我所说的,
CreateChannel
调用并不昂贵。它非常快。您可以为每个请求调用它。昂贵的是创建渠道工厂。这是您可以缓存的内容。@Darin-您是否有“为每个呼叫使用不同频道”的参考或链接。本博客是关于渠道工厂的最受引用的文章之一,其第一个最佳实践是“重用同一代理”:@ErnieL,
重用同一代理
意味着
重用同一渠道工厂
,而不是
重用同一渠道
。这有很大的区别。@DarinDimitrov“重用同一个代理”的意思是“重用通道”。请参阅作者在链接中提供的示例:ISimpleContract proxy=factory.CreateChannel();