静态缓存错误

时间:2009-10-22 15:44:10

标签: c# caching asp.net-2.0

我有一个静态缓存,它在设定的时间更新数据库中的一般对象列表。

这只是一个简单的静态列表:

private static List<myObject> _myObject;

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

我有两种方法可以更新名为UpdateMyObjectRemoveAnEntryFromMyObject的对象。

一切似乎都运行良好,但是每一次我都会遇到大量的错误。然后它就消失了,看起来又好了。有谁知道发生了什么?

1 个答案:

答案 0 :(得分:3)

每当您访问或更新静态缓存时,都需要使用lock语句。 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