개체 목록이있는 단일 클래스가 있습니다. 그래서 그 목록에 항목을 설정하는 클래스가 있습니다. 그런 다음, 그 싱글 톤 클래스에서 객체의 목록을 가져 오는 다른 클래스가 있습니다. 내 문제는 nservicebus 메시지를 받고 싱글 톤 클래스에서 목록을 가져올 때 목록에 개체가 들어 있지 않은 경우입니다. 그리고 그 대상이 존재할 때가 있습니다. 그래서, 내가 한 것은 싱글 톤 인스턴스를 얻을 때마다 'GetHashCode'를 실행하고 Singleton 클래스의 두 가지 인스턴스가 있음을 확인하는 것입니다. 내 코드로 무엇을 잘못 구현 했습니까? WebApplication에는 2 개의 Singleton 클래스 인스턴스가 있습니다.
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);
}
}
내가 내 구현에 대한 자세한 내용은 몇 가지 코드 위에 추가 한
을 편집했다.
아마'Lazy '접근 방식으로 갈 것입니다. 클래스를 싱글 톤 클래스로 만들지 말고 그냥 정적 Lazy 필드에 저장하십시오. –
어쨌든이리스트가 정적 싱글 톤이 필요한 이유는 무엇입니까? –
@CallumLinington 목록이 응용 프로그램에서 비동기 적으로 수정됩니다. 여러 클래스가 목록에 액세스하여 수정합니다. – chary