WCF ConcurrencyMode Single和InstanceContextMode PerCall
我的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
这可能吗? 谢谢
我知道这个问题被标记为已回答,但还有更好的选择 :
如果您使用InstanceContextMode.Single,那么您将为所有调用重用相同的实例。 如果您的服务长期运行,则需要您的代码完美地管理资源,因为如果没有重新启动服务,它将永远不会被垃圾收集。
而是保持InstanceContextMode.PerCall“每次调用我的服务创建一个新实例”,然后使用限制: 将最大并发实例设置为1 。 MSDN文档就是其中一个示例。
你所拥有的将导致每个请求启动一个新的服务实例(这就是PerCall所做的)。
这应该这样做:
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single, InstanceContextMode=InstanceContextMode.Single)]
仅供参考,如果你这样做,你将失去所有的可扩展性。 您将拥有一个单线程服务实例来响应所有请求。