【问题标题】:WCF ConcurrencyMode Single and InstanceContextMode PerCallWCF ConcurrencyMode Single 和 InstanceContextMode PerCall
【发布时间】:2011-10-30 15:48:29
【问题描述】:

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

这可能吗?谢谢

【问题讨论】:

  • 如您所描述的跨单独服务调用同步线程的唯一方法是将服务配置为将并发和实例上下文设置为单一(即单例模式)。如果您这样做,您的应用程序将几乎没有可扩展性,因为您正在创建一个非常有效的瓶颈;)
  • @Sixto:并发和上下文生命周期是两个不同的东西。不需要单例。

标签: c# wcf wcf-configuration servicebehavior


【解决方案1】:

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

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

而是将 InstanceContextMode.PerCall 保留为“每次调用我的服务都会创建一个新实例”,然后使用限制:max concurrent instances 设置为 1。 MSDN 文档正是这样做的示例之一。

【讨论】:

    【解决方案2】:

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

    应该这样做:

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

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

    【讨论】:

    • 这是否解决了 OP 中指定的这一要求?:“我希望对我的服务的每次调用都创建一个新的服务实例”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多