Модификация коллекции (Generics) в постоянном объекте приводит к исключениям или потере данных

Что я имею?

Объект, который сохраняется в статической переменной и вызывается при необходимости. Этот объект взаимодействует с другим приложением.

У меня есть две коллекции (общие списки) в этом объекте Журналы и «Данные, которые предварительно обработаны», которые будут использоваться позже

Проблема в том, что более одного человека пытаются использовать этот объект (объект взаимодействует с другим приложением), изменение коллекции приводит к исключениям или потере данных.

Исключение в случае циклов или использования функции поиска в общем списке

Я пытаюсь время от времени удалять предварительно выбранные данные или журналы. Я могу сделать это изначально, когда вызывается любая функция в объекте, но если коллекция изменяется, когда два человека (или потоки) пытаются вызвать одну и ту же функцию одновременно, это приводит к исключениям или потере данных.

Потеря данных в случае, если я иду:

        Список уже сохраненных данных
          {
           получить
              {
                 // Грубый синтаксис может быть неправильным - но в реальном приложении это правильно
                _alreadySavedData = _alreadySavedData.Find (Delegate (Data d {return d.CreatedOn.Date == DateTime.Now.Data;}));               

                 return _alreadySavedData;
              }
        }

Я подумал, что, выполнив вышеизложенное, я мог бы, по крайней мере, ограничить свою коллекцию «предварительно извлеченных данных» или журналов изо дня в день. Но при попытке получить доступ или изменить коллекцию одновременно, иногда один вызов «AlreadySavedData» может перезаписать параллельный вызов, который мог просто изменить (добавить) коллекцию, что приведет к потере данных.

Любая помощь будет оценена

12.10.2009 22:41:14
1 ОТВЕТ
РЕШЕНИЕ

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

    protected volatile _alreadySavedData;

    List AlreadySavedData
      {
       get
          {
             lock(_alreadySavedData)
             {
                //Rough Syntax maybe incorrect - but in actual application is correct
               _alreadySavedData= _alreadySavedData.Find(Delegate (Data d {return d.CreatedOn.Date == DateTime.Now.Data;}));               

                return _alreadySavedData;
             }
          }
    }

Это необходимо делать везде, где статическая коллекция изменяется или используется. Работа с параллелизмом в многопоточных приложениях в лучшем случае проблематична.

Полный текст статьи и руководства + предложения по теме см. В этой статье:

4
12.10.2009 22:44:31