如果我运行 WCF 服务(托管在 II7 中)并在上下文实例上使用 PerSession,一个 session 是否与一个线程相同?当客户端没有进行任何调用但在服务上有 session 时会发生什么? session 仍在占用线程吗?
如果我更改为 PerCall,我认为每次调用都会获得一个线程,并且在调用结束时返回该线程。
我在哪里可以找到此信息?
最佳答案
我相信你能找到答案和很好的解释here .
乍一看,出于可扩展性原因,您会使用 PerCall,而对于通常的 Web 场景,您会使用 PerSession。
使用PerSession时,一旦客户端首次调用服务实现实例,就会将其保留在服务器上。每个客户端都有自己的 session ,仅在每个客户端的一个线程(!)上执行。 所以,是的,默认情况下 1 个 session == 1 个线程。但您也可以更改ConcurrencyMode,以便在一个 session 内客户端可以执行多个并发调用。
如果是PerCall,服务实例将在调用完成后立即销毁。
[已编辑(与 David Nelson 讨论后)]:
(!) 这并不意味着同一个线程!这仅意味着ThreadPool将使用可用线程来运行服务代码。但是如果启动1000个并发客户端,ThreadPool就会分配很多线程,这就涉及到资源,比如内存。
用代码解释线程用法:
我创建了简单的计算器服务来展示 WCF 服务的跟踪工作原理。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorService
{
private int _threadIdOnCreating = Thread.CurrentThread.ManagedThreadId;
public int AccumulatedValue { get; private set; }
public int Accumulate(int valueToAdd)
{
AccumulatedValue += valueToAdd;
Console.WriteLine(
string.Format("Accumulated: {0}. ThreadIdOnServiceCreating:{1} CurrentThreadId:{2}",
AccumulatedValue, _threadIdOnCreating, Thread.CurrentThread.ManagedThreadId));
return AccumulatedValue;
}
}
我使用参数 2 运行 Accumulate 方法五次,然后创建新的客户端代理并执行相同的操作。 下面是输出,它证明服务器保留了服务实现的实例(创建时的 threadId),但方法在不同的线程上运行,取自 ThreadPool。
I'm calculator
Accumulated: 2. ThreadIdOnServiceCreating:6 CurrentThreadId:6
Accumulated: 4. ThreadIdOnServiceCreating:6 CurrentThreadId:7
Accumulated: 6. ThreadIdOnServiceCreating:6 CurrentThreadId:6
Accumulated: 8. ThreadIdOnServiceCreating:6 CurrentThreadId:7
Accumulated: 10. ThreadIdOnServiceCreating:6 CurrentThreadId:6
Accumulated: 2. ThreadIdOnServiceCreating:9 CurrentThreadId:9
Accumulated: 4. ThreadIdOnServiceCreating:9 CurrentThreadId:6
Accumulated: 6. ThreadIdOnServiceCreating:9 CurrentThreadId:9
Accumulated: 8. ThreadIdOnServiceCreating:9 CurrentThreadId:6
Accumulated: 10. ThreadIdOnServiceCreating:9 CurrentThreadId:8
关于.net - WCF 1 session = 1 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000248/