WCF是否在同一线程中执行单例WCF服务的操作?

3

我有一个被标记为ServiceBehavior属性的服务

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,
 ConcurrencyMode = ConcurrencyMode.Multiple)]

这个服务的操作有没有可能由同一个线程执行?

我在ThreadLocal变量中存储了重要数据,该数据将用于单次操作执行。

2个回答

3

不是的,每个请求都在不同的线程中进行响应。InstanceContextMode.Single属性指定该服务对于每个请求使用相同的对象(及其成员)。


1
为了清晰起见,每个请求/线程都排队使用同一个对象。 - H H

2

请注意,在 WCF 中,线程是由线程池处理的 => 线程在请求处理后不会被处理掉,而是返回到池中,以便可以重用于其他请求处理。我不确定 ThreadLocal<T> 如何工作,但使用 ThreadStaticAttribute 可以轻松地将值从一个请求处理传递到下一个随机请求处理,后者将使用相同的线程。


好的,但是一个线程不能同时执行多个操作。那么,如果我在每个操作之后删除ThreadStatic/ThreadLocal<>变量,那我就是安全的吗? - Sandeep
我不知道WCF中是否存在任何线程切换,所以我认为你应该是安全的。但是,如果你在应用程序中发现一些奇怪的非确定性行为,这应该是你首先检查的区域。 - Ladislav Mrnka
实际上,在异步服务操作中可能会有线程切换,但我认为你不需要使用它们:http://msdn.microsoft.com/en-us/library/ms734701.aspx - Ladislav Mrnka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接