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 文档正是这样做的示例之一。

于 2011-08-22T15:19:43.700 回答
5

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

这应该这样做:

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

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

于 2011-08-19T14:13:44.810 回答