web-dev-qa-db-ja.com

WCF ConcurrencyModeSingleおよびInstanceContextModePerCall

Wcfサービスの構成に問題があります。サービスを呼び出すたびに、サービスの新しいインスタンスを作成したいと思います。並行性のために、1つの呼び出しが別の開始の前に終了したいと思います。

したがって、私がこのようなサービスを持っている場合:

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single,
InstanceContextMode=InstanceContextMode.PerCall)]
public class MyService: IMyService
{
    public bool MyServiceOp()
    {
        Debug.WriteLine("thread "+ 
            Thread.CurrentThread.ManagedThreadId.ToString());
        Debug.WriteLine("start operation ");
        Do_work()
        Debug.WriteLine("end operation");
        return true;
    }
}

ループ内の複数の呼び出しでそれを呼び出すと、トレースは次のようになります。

thread 1
thread 2
start operation
start operation
end operation
end operation

私はこれが欲しいのですが:

thread 1 start operation end operation
thread 2 start operation end operation

これは可能ですか?ありがとうございました

20
maxence51

この質問が回答済みとしてマークされていることは知っていますが、より良い代替案があります

InstanceContextMode.Singleを使用する場合は、すべての呼び出しで同じインスタンスを再利用します。サービスが長時間実行されている場合、サービスを再起動しないとガベージコレクションが行われないため、コードでリソースを完全に管理する必要があります。

代わりに、「サービスへのすべての呼び出しで新しいインスタンスが作成される」ためにInstanceContextMode.PerCallを保持してから、スロットリングを使用します。最大同時インスタンス を1。 MSDNのドキュメントは、例の1つとしてまさにこれを行っています。

20
ErnieL

そこにあるものは、リクエストごとにサービスの新しいインスタンスが起動する結果になります(これがPerCallの機能です)。

これはそれを行う必要があります:

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single, InstanceContextMode=InstanceContextMode.Single)]

参考までに、これを行うと、すべてのスケーラビリティが失われます。すべてのリクエストに応答する単一のスレッドサービスの単一のインスタンスがあります。

5
Patrick Sears