2017-02-09 7 views
0

私はオブジェクトのリストが配置されるシングルトンクラスを持っています。だから私はそのリストに項目を設定するクラスを持っています。次に、そのシングルトンクラスからオブジェクトのリストを取得する別のクラスがあります。私の問題は、nservicebusメッセージを受け取ってシングルトンクラスからリストを取得したときに、リストにオブジェクトが含まれていないことがあります。オブジェクトが存在することもあります。だから、私がしたことは、シングルインスタンスを取得して、GetHashCodeを実行して、Singletonクラスの2つのインスタンスがあることを確認するたびに発生します。私のコードで何が正しく実装されなかったのですか?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); 
    } 
} 

私は私の実装の詳細については、上記のいくつかのコードを追加しました

を編集しました。

+0

私はたぶん 'Lazy 'アプローチに行くでしょう。クラスをシングルトンクラスにしないでください。ちょうど 'static Lazy 'フィールドに値を格納してください。 –

+0

なぜこのリストは最初の場所でスタティックシングルトンにする必要がありますか? –

+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)ヘルプ? –

関連する問題