質問

データベースからオブジェクトの一般的なリストを設定時に更新する静的キャッシュがあります。

これは単純な静的リストです:

private static List<myObject> _myObject;

public List<myObject> FillMyObject()
{
     if(_myObject == null || myTimer)
      _myObject = getfromDataBase();
}

UpdateMyObject および RemoveAnEntryFromMyObject というオブジェクトを更新する2つのメソッドがあります。

すべてが正常に実行されているように見えますが、誰もがたまに大量のエラーを受け取ります。その後、それは消えて再び元気になります。誰が何が起こっているか知っていますか?

役に立ちましたか?

解決

ロック静的キャッシュにアクセスまたは更新するときはいつでもステートメント。ロック文は、完了するまで他のスレッドの実行をブロックします。これを行わないと、別のスレッドが行を削除すると同時に、1つのスレッドがコレクションをループしようとしている可能性があります。正確なシナリオによっては、ダブルチェックロックを使用することをお勧めします。

    static readonly object lockObj = new object();
    private static List<myObject> _myObject;

     public List<myObject> FillMyObject()
     {
         lock (lockObj)
         {
            if(_myObject == null || myTimer)
               _myObject = getfromDataBase();
         }
     }


     public List<myObject> UpdateMyObject(somevalue)
     {
        lock (lockObj)
         {
            _myObject.RemoveAll(delegate(myObject o)
                                {
                                    return o.somevalue == somevalue;
                                 });)
         }
     }

さらに読む

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top