2017-02-09 145 views
0

我有一個單例類,其中放置了一個對象列表。所以我有一個課程將項目設置爲該列表。然後,我有另一個類獲取該單例類的對象列表。我的問題是,當我收到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

我添加了上述的一些代碼對我實施的更多信息。

+0

我可能會只是'懶惰的'方法。不要讓這個類成爲一個單獨的類,只是將它的值存儲在'Static Lazy '字段中 –

+0

爲什麼你需要這個List在第一個地方是靜態單例呢? –

+0

@CallumLinington該列表在應用程序中異步修改。多個類訪問和修改列表 – chary

回答

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; 
      } 
     } 
    } 
} 
+0

我試過雙鎖定方法,但仍然有2個不同的實例 – chary

+0

Will [this文章](https://docs.particular.net/nservicebus/containers/#dependency-lifecycle-singleinstance)幫助? –