Модификация коллекции (Generics) в постоянном объекте приводит к исключениям или потере данных - PullRequest
0 голосов
/ 13 октября 2009

Что у меня есть?

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

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

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

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

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

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

        List AlreadySavedData
          {
           get
              {
                 //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;
              }
        }

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

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

1 Ответ

4 голосов
/ 13 октября 2009

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

    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;
             }
          }
    }

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

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

...