WebApplication有2个单例类的实例
我有一个单例类,其中放置了一个对象列表。所以我有一个课程将项目设置为该列表。然后,我有另一个类获取该单例类的对象列表。我的问题是,当我收到nservicebus消息并从单例类获取列表时,有时候列表不包含任何对象。有时存在这些物体。所以,我所做的每次都得到单例实例,我执行'GetHashCode'并确认有2个不同的Singleton类实例。我用我的代码错误地执行了什么?WebApplication有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
我添加了上述的一些代码对我实施的更多信息。
您将需要实施双重检查锁定,请参阅here,并根据您的设置还使用volatile关键字。见下面的代码:
public static SingletonClass Instance
{
get
{
if (null == _singletonClass)
{
lock (_lockObj)
{
if (null == _singletonClass)
{
_singletonClass = new SingletonClass();
_objList = new List<object>();
}
return _singletonClass;
}
}
}
}
我试过双锁定方法,但仍然有2个不同的实例 – chary
Will [this文章](https://docs.particular.net/nservicebus/containers/#dependency-lifecycle-singleinstance)帮助? –
我可能会只是'懒惰的'方法。不要让这个类成为一个单独的类,只是将它的值存储在'Static Lazy '字段中 –
为什么你需要这个List在第一个地方是静态单例呢? –
@CallumLinington该列表在应用程序中异步修改。多个类访问和修改列表 – chary