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
これは可能ですか?ありがとうございました
この質問が回答済みとしてマークされていることは知っていますが、より良い代替案があります:
InstanceContextMode.Singleを使用する場合は、すべての呼び出しで同じインスタンスを再利用します。サービスが長時間実行されている場合、サービスを再起動しないとガベージコレクションが行われないため、コードでリソースを完全に管理する必要があります。
代わりに、「サービスへのすべての呼び出しで新しいインスタンスが作成される」ためにInstanceContextMode.PerCallを保持してから、スロットリングを使用します。最大同時インスタンス を1。 MSDNのドキュメントは、例の1つとしてまさにこれを行っています。
そこにあるものは、リクエストごとにサービスの新しいインスタンスが起動する結果になります(これがPerCallの機能です)。
これはそれを行う必要があります:
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single, InstanceContextMode=InstanceContextMode.Single)]
参考までに、これを行うと、すべてのスケーラビリティが失われます。すべてのリクエストに応答する単一のスレッドサービスの単一のインスタンスがあります。