2009-10-22 69 views
2

我有一個靜態緩存,它在設定的時間更新數據庫中對象的通用列表。靜態緩存錯誤

這只是一個簡單的靜態列表:

private static List<myObject> _myObject; 

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

我有2種方法來更新我的對象調用UpdateMyObjectRemoveAnEntryFromMyObject

一切似乎運行良好,但每個人都有一次,我得到了大量的錯誤。然後它消失,似乎再次罰款。有誰知道發生了什麼事?

+1

什麼樣的錯誤?它看起來像是一個同步問題,但你沒有給我們足夠的信息繼續下去。您是否在多線程環境(即Web應用程序)中使用它? – 2009-10-22 15:50:52

+0

是一個使用.net 2.0的網絡應用程序 – 2009-10-22 16:00:50

回答

3

無論何時訪問或更新靜態緩存,您都需要使用lock語句。鎖語句將阻止其他線程執行,直到完成。如果你不這樣做,你可能會有一個線程試圖在另一個線程刪除一行的同時循環集合。根據您的具體情況,您可能需要使用double check locking

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; 
           });) 
     } 
    } 

Further Reading

+0

謝謝你有我可以閱讀的任何地方嗎? – 2009-10-22 16:01:38

+0

請參閱「進一步閱讀」 – cgreeno 2009-10-22 16:02:48

+0

參見http://msdn.microsoft.com/en-us/library/ms173179.aspx – TrueWill 2009-10-22 17:18:40