如果我运行我的WCF服务(在II7中托管)并在contextinstance上使用PerSession,那么一个会话是否与一个线程相同?当客户端没有进行任何呼叫但是在服务上有会话时会发生什么?会话仍然是一个线程?
如果我更改为PerCall,我想我将在每次调用时获得一个线程,并且在调用结束时返回此线程。
我在哪里可以找到这些信息?
我相信你可以找到答案和良好的解释here。
乍一看,出于可伸缩性原因,您将使用PerCall,对于常见的Web场景,您将使用PerSession。
[编辑(与David Nelson讨论后)]:
(!)它不代表同一个线程!它只意味着ThreadPool将使用可用的线程来运行服务代码。但是如果启动1000个并发客户端,ThreadPool将分配许多线程,这涉及资源,如内存。
代码的线程使用说明:
我创建了简单的计算器服务来显示如何为WCF服务执行treading。
[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
“如果我运行我的WCF服务(在II7中托管)并在上下文实例上使用PerSession,那么一个会话是否与一个线程相同?”
不,请求将由线程池处理。
“当客户端没有进行任何呼叫但是在服务上有会话时会发生什么?会话是否还在线程?”
不,如果没有服务请求,则会话不会占用一个线程。 WCF“会话”只是数据;状态绑定到会话ID。它与线程无关。