WCF 服务的多个应用程序域导致并发问题

Posted

技术标签:

【中文标题】WCF 服务的多个应用程序域导致并发问题【英文标题】:WCF Service's Multiple App Domains Causing Issues With Concurrency 【发布时间】:2013-11-05 16:25:50 【问题描述】:

我有一个使用以下 ServiceBehavior 属性定义的 WCF 服务端点。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]

我的服务中的调用存在问题,需要保证一个对象只创建一次。在我的服务中调用以下代码。

public class MySingletonDataProvider
     private static MySingletonDataProvider _instance;
     private static readonly object _lock = new object();

     public static MySingletonProvider Create()

          lock(_lock)

              if(_instance == null)
                 _instance = new MySingletonProvider();
                 Log.Info("New Instance Created " + AppDomain.CurrentDomain.FriendlyName");
              

              return _instance;
          
     

当遇到这种情况时,我们通常会收到 3-5 条日志,如下所示:

- "New Instance Created 123252352323623"
- "New Instance Created 423523562362362"
- "New Instance Created 235623623462366"

显示多个 AppDomain 能够执行锁内的代码。这造成了巨大的问题。有什么解决方案可以保证这个实例只创建一次?

【问题讨论】:

【参考方案1】:

CLR 为每个 AppDomain 创建新的 MySingletonDataProvider 实例,因此您有单独的锁定对象。我建议使用某种进程间同步原语,例如互斥锁。 http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx

【讨论】:

以上是关于WCF 服务的多个应用程序域导致并发问题的主要内容,如果未能解决你的问题,请参考以下文章

微服务架构

微服务架构

通过共享通道并发 WCF 调用

WCF 服务接受并发请求

如何更改 WCF 中的限制并发线程(核心 20 个线程)?

并发高并发集群的含义