我有一个静态缓存,它在设定的时间更新数据库中的一般对象列表。
这只是一个简单的静态列表:
private static List<myObject> _myObject;
public List<myObject> FillMyObject()
{
if(_myObject == null || myTimer)
_myObject = getfromDataBase();
}
我有两种方法可以更新名为UpdateMyObject
和RemoveAnEntryFromMyObject
的对象。
一切似乎都运行良好,但是每一次我都会遇到大量的错误。然后它就消失了,看起来又好了。有谁知道发生了什么?
答案 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;
});)
}
}