我有一个使用以下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能够执行锁定中的代码。这导致了巨大的问题。解决方案是什么,以便我可以保证这个实例只创建一次?
答案 0 :(得分:0)
CLR为每个AppDomain创建新的MySingletonDataProvider实例,因此您有单独的锁定对象。我建议使用某种进程间同步原语,例如互斥体。 http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx