WCF服务和线程

时间:2010-10-19 14:19:05

标签: c# .net multithreading wcf

我创建了一个简单的WCF(.NET 3.5)服务,该服务定义了10个合同,这些合同基本上是对提供的数据进行计算。目前我预计很少有客户打电话给其中一些合同。如何使服务更具响应性?我觉得服务会等到它处理一个请求转到下一个请求。 如何在WCF中使用多线程来加快速度?

4 个答案:

答案 0 :(得分:21)

虽然我同意Justin's answer,但我相信在WCF如何运作方面可以有更多的亮点。

您可以发表具体声明:

  

我觉得服务会   等到它处理一个请求   去下一个。我该怎么用   在WCF中进行多线程处理以加快速度   起来?

服务的并发性(它可以同时进行多少次调用)取决于附加到服务的ConcurrencyMode value for the ServiceBehavior。默认情况下,此值为ConcurrencyMode.Single,这意味着它会逐个序列化调用。

但是,这可能不像你想象的那么多。如果您的服务InstanceContextMode等于InstanceContextMode.PerCall,那么这不是问题;每次通话都会创建一个新的服务实例,而不会用于任何其他通话。

但是,如果您有单例或基于会话的服务对象,则将序列化对该服务实现实例的调用。

您可以随时更改ConcurrencyMode,但请注意,如果您这样做,则必须手动处理并发问题和资源访问,因为您已明确告知WCF您将这样做。

重要的是不要仅仅因为你认为它会导致性能提升而改变它们。虽然并发性并不是很多,但是服务的实例化方面很大程度上是服务身份的一部分(如果是会话或不是基于会话的),并且更改它们会影响使用服务的客户端,所以不要这样做它很轻松。

当然,这并不能说明实际实施服务的代码是否有效。当你指出是这种情况时,这肯定是需要调查的东西。

答案 1 :(得分:3)

这绝对是预成熟的优化。首先实施您的服务,看看是否存在问题。

我想你会发现你一无所畏。当请求处理时,服务器不会阻止单个请求。 IIS / WCF应该很好地处理好事情。

答案 2 :(得分:1)

我不熟悉WCF,但这个过程可以异步吗? 如果您期望大量数据和密集计算,一个选项可能是发送id,在单独的线程中计算值,然后提供使用初始id返回结果的方法

类似的东西:

 int id = Service.CalculateX(...);
 ...
 var y = Service.GetResultX(id);

答案 3 :(得分:0)

默认情况下,Instancing为PerSession。 见WCF Service defaults

但是,如果您使用不支持会话的会话绑定(如BasicHttpBinding)或者通道/客户端没有创建会话,那么此行为类似于PerCall

请参阅[绑定类型会话支持](https://docs.microsoft.com/en-us/dotnet/framework/wcf/system-provided-bindings)。

每个WCF客户端对象都将创建一个Session,并且对于每个会话,将有一个服务器实例,该服务器实例具有单个线程,该线程同步地为来自该特定WCF客户端对象的所有调用提供服务。

因此,多个客户端每个都有自己的会话,因此默认情况下服务器实例和线程不会相互阻塞。 它们只会在DB,CPU等共享资源上相互影响。

请参阅Using sessions

与其他人一样,建议您在开始使用Instancing和Concurrency模式之前确保实现是有效的。

如果没有真正的理由对服务器进行调用,您也可以考虑客户端计算。