Вопрос

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

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

private static List<myObject> _myObject;

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

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

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

Это было полезно?

Решение

Вам необходимо использовать блокировку заявление всякий раз, когда вы обращаетесь к статическому кешу или обновляете его. Оператор блокировки будет блокировать выполнение других потоков до его завершения. Если вы этого не сделаете, у вас может быть один поток, пытающийся перебрать коллекцию одновременно с удалением строки другим потоком. В зависимости от конкретного сценария вы можете использовать двойную проверку блокировки .

    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