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 服务的多个应用程序域导致并发问题的主要内容,如果未能解决你的问题,请参考以下文章