WCF ConcurrencyMode Single和InstanceContextMode PerCall

时间:2011-08-19 13:53:05

标签: c# wcf wcf-configuration servicebehavior

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

这可能吗?谢谢

2 个答案:

答案 0 :(得分:20)

我知道这个问题被标记为已回答,但有更好的选择

如果您使用InstanceContextMode.Single,那么您将为所有调用重用相同的实例。如果您的服务长期运行,则需要您的代码完美地管理资源,因为如果没有重新启动服务,它将永远不会被垃圾收集。

而是保持InstanceContextMode.PerCall“每次调用我的服务创建一个新实例”,然后使用限制:max concurrent instances设置为1 。 MSDN文档就是其中一个例子。

答案 1 :(得分:5)

你所拥有的将导致服务的新实例随每个请求而旋转(这就是PerCall所做的)。

这应该这样做:

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

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