WCF ConcurrencyMode Single和InstanceContextMode PerCall应该用哪个?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我的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)]

如果你这样做,你会失去所有的可扩展性。您将拥有单个线程服务的单个实例来响应所有请求。

扫码关注云+社区