我有一个静态缓存,它会在设定的时间更新数据库中的通用对象列表。
这只是一个简单的静态列表:
private static List<myObject> _myObject;
public List<myObject> FillMyObject()
{
if(_myObject == null || myTimer)
_myObject = getfromDataBase();
}
我有 2 个方法来更新我的对象,称为 UpdateMyObject
和 RemoveAnEntryFromMyObject
。
一切似乎都运行良好,但每个人偶尔都会遇到大量错误。然后它消失了,看起来又好了。有谁知道发生了什么事吗?
最佳答案
您需要使用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;
});)
}
}
关于c# - 静态缓存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1608129/