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

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

private static List<myObject> _myObject;

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

我有两种方法来更新我的对象,名为 UpdateMyObject RemoveAnEntryFromMyObject

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

有帮助吗?

解决方案

您需要使用锁定当您访问或更新静态缓存时,语句。 lock语句将阻止其他线程执行直到完成。如果不这样做,可能有一个线程试图在另一个线程删除行的同时遍历集合。根据您的具体情况,您可能需要使用双重检查锁定

    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