WebApplication有2个Singleton类实例

时间:2017-02-09 11:47:48

标签: c# iis singleton nservicebus multiple-instances

我有一个单例类,其中放置了一个对象列表。所以我有一个类将项目设置为该列表。然后,我有另一个类从该单例类中获取对象列表。我的问题是当我收到nservicebus消息并从单例类中获取列表时,有时列表中不包含任何对象。并且有时存在对象。所以,我所做的就是每当我得到单例实例时,我执行' GetHashCode'并确认Singleton类有2个不同的实例。我的代码错误地实现了什么?

public class SingletonClass
{
    private static readonly object _lockObj = new object();
    private static readonly object _lockObjList = new object();

    static SingletonClass _singletonClass;

    private static List<object> _objList;


    private SingletonClass()
    {

    }

    public static SingletonClass Instance
    {
        get
        {
            lock(_lockObj)
            {
                if (null == _singletonClass)
                {
                    _singletonClass= new SingletonClass();
                    _objList = new List<object>();
                }
                return _singletonClass;
            }
        }
    }

    public List<obj> GetList()
    {
        lock(_lockObjList)
        {
            return _objList;
        }
    }

    public void UpdateProgress(int index, double value)
    {
        lock(_lockObjList)
        {
            _objList[index].Progress = value;
        }
    }


    public void SetList(List<obj> objs)
    {
        lock(_lockObjList)
        {
            _objList = objs;
        }
    }
}
public class MessageHandler : HubInvoker<MessageHub>
{

    public MessageHandler () {}

    public void OnReceiveMessage(object sender, MessageArgs args)
    {
        var list = SingletonClass.Instance.GetList();
        if(list != null){
            var i = 0;
            for(; i < list.Length && list[i].Id == args.Id; i++);

            if(i < list.Length)
            {
                SingletonClass.Instance.UpdateProgress(i, args.Progress);
            }
        }
    }
}
public class ObjController
{
     public ObjController() {}

     public void SetList(List<obj> objs)
     {
         SingletonClass.Instance.SetList(objs);
     }
}

EDITED

我已在上面添加了一些代码,以获取有关我的实施的更多信息。

1 个答案:

答案 0 :(得分:0)

您需要实施双重检查锁定,请参阅here并根据您的设置设置volatile关键字。见下面的代码:

public static SingletonClass Instance
{
    get
    {
        if (null == _singletonClass)
        {
            lock (_lockObj)
            {
                if (null == _singletonClass)
                {
                    _singletonClass = new SingletonClass();
                    _objList = new List<object>();
                }
                return _singletonClass;
            }
        }
    }
}