У меня есть статический кеш, который в установленное время обновляет общий список объектов из базы данных.
Это просто простой статический список:
private static List<myObject> _myObject;
public List<myObject> FillMyObject()
{
if(_myObject == null || myTimer)
_myObject = getfromDataBase();
}
У меня есть 2 метода для обновления моего объекта с именем 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;
});)
}
}