WCFサービス(II7でホストされている)を実行し、contextinstanceでPerSessionを使用する場合、1つのセッションは1つのスレッドと同じになりますか?クライアントが電話をかけていないが、サービスでセッションを行っている場合はどうなりますか?セッションはまだスレッドを取っていますか?
PerCallに変更すると、呼び出しごとにスレッドが取得され、呼び出しが終了するとこのスレッドが返されると思います。
この情報はどこにありますか?
ここで答えと適切な説明を見つけることができると思います。
一見すると、スケーラビリティの理由でPerCallを使用し、通常の Web シナリオではPerSessionを使用します。
PerSessionを使用すると、クライアントが最初に呼び出したサービス実装のインスタンスがサーバーに保持されます。すべてのクライアントには、クライアントごとに 1 つのスレッド(!)でのみ実行される独自のセッションがあります。したがって、はい 1 セッション == デフォルトで 1 スレッド。ただし、 ConcurrencyModeを変更することもできるため、1 つのセッション内でクライアントが多数の同時呼び出しを実行できます。
PerCallサービス インスタンスの場合、呼び出しが完了するとすぐに破棄されます。
[編集済み (David Nelson との話し合いの後)]:
(!)同一スレッドとは限りません!これは、ThreadPool が利用可能なスレッドを使用してサービス コードを実行することを意味するだけです。ただし、1000 の同時クライアントを開始すると、ThreadPool はメモリなどのリソースを含む多くのスレッドを割り当てます。
コードによるスレッドの使用方法の説明:
WCF サービスでトレッドがどのように機能するかを示すために、単純な Calculator サービスを作成しました。
[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 メソッドを 5 回実行し、新しいクライアント プロキシを作成して同じことを行いました。以下の出力は、サーバーがサービス実装のインスタンス (作成時の 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
「(II7 でホストされている) WCF サービスを実行し、コンテキスト インスタンスで PerSession を使用する場合、1 つのセッションは 1 つのスレッドと同じになりますか?」
いいえ、リクエストはスレッド プールによって処理されます。
「クライアントが呼び出しを行っていないが、サービスにセッションがある場合はどうなりますか?セッションはまだスレッドを使用していますか?」
いいえ、処理中のリクエストがない場合、セッションはスレッドを使用していません。WCF の「セッション」は単なるデータです。セッション ID に関連付けられた状態。スレッドとは関係ありません。