Singleton实例始终为null

时间:2015-11-11 12:42:51

标签: c# singleton

我有一个带有当前单例类的MVC程序的ASP.net:

    public sealed class Foo
{
    private static volatile Foo_instance;
    private static object syncRoot = new Object();
    private List<Obj> _objList;

    private Foo()
    {
        _objList = new List<Obj>();
    }

    public static Foo Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (syncRoot)
                {
                    _instance = new Foo();
                }
            }
            return _instance;
        }
    }
    public void AddObjToList(Obj _object)
    {
        lock (_instance)
        {
            _objList.Add(_object);
        }
    }   
    public void FindAndRemoveObj(string id) 
    {
        lock (_instance)
        {
            Obj _object = null;
            _object= _objList.FirstOrDefault(t => t.UniKey == id);
            if (_object!= null) 
            {
                _objList.Remove(object);
            }
        }
    }
}

第一次获取此类的实例时,它将返回foo类的新/干净实例,如预期的那样,然后填充列表,但是将从同一列表中删除itens的第二个类接收带有空列表的新实例。

2 个答案:

答案 0 :(得分:1)

此代码的锁定位置错误:

if (_instance == null)
{
    lock (syncRoot)
    {
        _instance = new Foo();
    }
}

当线程1创建_instance时,第二个线程将阻塞锁,然后在释放时重新创建_instance。

另外要注意的是,在服务器查找中,不应该依赖IIS中的静态变量。应用程序池可以随时回收。

答案 1 :(得分:0)

结论是asp.net正在创建域的新实例,并且每次都会导致一个新的单例对象。我已经搜索了如何在域之间同步对象,但这对我来说太“解决”了,所以我决定添加一个布尔列,用确认或失败更新值。

谢谢大家