WCF InstanceContextMode = InstanceContextMode.PerSession& ConcurrencyMode = ConcurrencyMode.Single仍然是TraceLog中的不同ThreadID

时间:2016-10-06 11:34:17

标签: c# wcf trace

我们已将服务行为设置为[ServiceBehavior(Namespace =" abc",InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode = ConcurrencyMode.Single,UseSynchronizationContext = false)]

正如您所看到的,我们已将Concurrency Mode设置为Single,但我们仍然能够在WCF跟踪日志中看到多个ThreadID。

需要帮助以使WCF调用线程安全,以便按顺序处理每条消息。

谢谢, Srujal

1 个答案:

答案 0 :(得分:0)

ConcurrencyMode控制每个InstanceContext的线程。由于您使用InstanceContextMode = InstanceContextMode.PerSession,因此您仍然允许同时存在多个服务实例,每个会话一个。

如果您改为设置InstanceContextMode = InstanceContextMode.Single,则可以创建单件服务,即只创建一个服务实例。结合ConcurrencyMode = ConcurrencyMode.Single,这将实现所需的行为:

  

服务实例是单线程的,不接受可重入的调用。如果InstanceContextMode属性为Single,并且在实例为调用提供服务时其他消息到达,则这些消息必须等到服务可用或消息超时。 (MSDN documentation ConcurrencyMode)

您可以在MSDN上的Sessions, Instancing, and Concurrency上阅读更多内容。