21

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

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

[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

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

4

2 に答える 2

20

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

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

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

于 2011-08-22T15:19:43.700 に答える
5

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

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

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

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

于 2011-08-19T14:13:44.810 に答える