WCF 1 Session = 1线程?

问题描述 投票:2回答:2

如果我运行我的WCF服务(在II7中托管)并在contextinstance上使用PerSession,那么一个会话是否与一个线程相同?当客户端没有进行任何呼叫但是在服务上有会话时会发生什么?会话仍然是一个线程?

如果我更改为PerCall,我想我将在每次调用时获得一个线程,并且在调用结束时返回此线程。

我在哪里可以找到这些信息?

.net wcf session
2个回答
3
投票

我相信你可以找到答案和良好的解释here

乍一看,出于可伸缩性原因,您将使用PerCall,对于常见的Web场景,您将使用PerSession。

  • 当客户端使用PerSession时,第一次调用服务实现的实例将保留在服务器上。每个客户端都有自己的会话,每个客户端只在一个线程(!)上执行。所以,是1会话== 1线程默认。但您也可以更改ConcurrencyMode,因此在一个会话中客户端可以执行许多并发调用。
  • 如果PerCall服务实例将在呼叫完成后立即处理。

[编辑(与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

1
投票

“如果我运行我的WCF服务(在II7中托管)并在上下文实例上使用PerSession,那么一个会话是否与一个线程相同?”

不,请求将由线程池处理。

“当客户端没有进行任何呼叫但是在服务上有会话时会发生什么?会话是否还在线程?”

不,如果没有服务请求,则会话不会占用一个线程。 WCF“会话”只是数据;状态绑定到会话ID。它与线程无关。

© www.soinside.com 2019 - 2024. All rights reserved.