.net - WCF 1 session = 1 线程?

标签 .net wcf session

如果我运行 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/

相关文章:

.net - 使用 WPF 在外发光上实现平滑动画

c# - 如何在 specflow 特征表中使用 "|"关键字

WCF RIA 服务和 session 外的持久/静态变量

wcf - 使用 PowerShell 脚本在 IIS 上构建和部署 WCF 服务的步骤

javascript - 如果 JavaScript 计时器正在运行,则防止 session 超时

session - 在 Sandbox paypal 环境中运行多个 WebDriver Test 实例会导致 Session 超时问题

.net - 将邮箱从 Exchange Server 导出到 PST 文件

WCF 无法打开 MSMQ 队列 : Access is Denied

php - Laravel - 服务提供商中的 session 变量为空

c# - 如何逐一生成IEnumerable的元素