2009-10-22 73 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