Ошибка статического кэша

2

У меня есть статический кеш, который в установленное время обновляет общий список объектов из базы данных.

Это просто простой статический список:

private static List<myObject> _myObject;

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

У меня есть 2 метода для обновления моего объекта с именем UpdateMyObject и RemoveAnEntryFromMyObject.

Кажется, все работает нормально, но все время от времени я получаю массу ошибок. Затем он уходит и кажется прекрасным снова. Кто-нибудь знает что происходит?

  • 1
    Что за ошибки? Это похоже на проблему синхронизации, но вы не дали нам достаточно информации, чтобы продолжить. Вы используете это в многопоточном контексте (например, веб-приложение)?
  • 0
    Да, веб-приложение, использующее .net 2.0
Теги:
caching
asp.net-2.0

1 ответ

3
Лучший ответ

Вам нужно использовать 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;
                                 });)
         }
     }

Дополнительная литература

  • 0
    Спасибо, у вас есть где я могу прочитать об этом?
  • 0
    Пожалуйста, обратитесь к «Дальнейшее чтение»
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню