我创建了一个简单的WCF(.NET 3.5)服务,该服务定义了10个合同,这些合同基本上是对提供的数据进行计算。目前我预计很少有客户打电话给其中一些合同。如何使服务更具响应性?我觉得服务会等到它处理一个请求转到下一个请求。 如何在WCF中使用多线程来加快速度?
答案 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等共享资源上相互影响。
与其他人一样,建议您在开始使用Instancing和Concurrency模式之前确保实现是有效的。
如果没有真正的理由对服务器进行调用,您也可以考虑客户端计算。