Использование параллельного словаря — модификация потокобезопасной коллекцииC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Использование параллельного словаря — модификация потокобезопасной коллекции

Сообщение Anonymous »

Недавно при использовании общего словаря я столкнулся со следующим исключением:


Произошло исключение InvalidOperationException. Коллекция была изменена


Я понял, что эта ошибка возникла в первую очередь из-за проблем с потокобезопасностью в статическом словаре, который я использовал.

Небольшая предыстория: в настоящее время у меня есть приложение, в котором есть 3 разных метода, связанных с этой проблемой.
  • Метод A перебирает словарь с помощью foreach и возвращает значение.
  • Метод B добавляет данные в словарь.
  • Метод C изменяет значение ключа в словаре.
Иногда при переборе словаря данные также добавляются, что и является причиной этой проблемы. Я продолжаю получать это исключение в части кода foreach, где я перебираю содержимое словаря. Чтобы решить эту проблему, я заменил общий словарь на ConcurrentDictionary, и вот подробности того, что я сделал.

Цель: Моя основная цель — чтобы полностью удалить исключение

Для метода B (который добавляет новый ключ в словарь) я заменил .Add на TryAdd

Для метода C (который обновляет значение словаря) я не вносил никаких изменений. Грубый набросок кода выглядит следующим образом:

Код: Выделить всё

  static public int ChangeContent(int para)
{
foreach (KeyValuePair pair in static_container)
{
if (pair.Value.propA != para ) //Pending cancel
{
pair.Value.data_id = prim_id;    //I am updating the content
return 0;

}
}
return -2;
}
Для метода A — я просто перебираю словарь, и на этом этапе работающий код останавливается (в режиме отладки), и Visual Studio сообщает об этом. Мне кажется, что именно здесь произошла ошибка. Код, который я использую, аналогичен следующему

Код: Выделить всё

    static public CustObject RetrieveOrderDetails(int para)
{
foreach (KeyValuePair pair in static_container)
{
if (pair.Value.cust_id.Equals(symbol))
{
if (pair.Value.OrderStatus != para)
{
return pair.Value; //Found
}
}
}
return null; //Not found
}
Устранят ли эти изменения исключение, которое я получаю?

Изменить:

На этой странице указано, что метод GetEnumerator позволяет проходить по элементам параллельно с записью (хотя он может быть устаревшим). Разве это не то же самое, что использовать foreach?

Подробнее здесь: https://stackoverflow.com/questions/149 ... dification
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Правильное использование параллельного словаря
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Работаете с внешней .NET-библиотекой, которая не является потокобезопасной?
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Является ли get() потокобезопасной операцией в кеше Guava?
    Anonymous » » в форуме JAVA
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Является ли библиотека С# EPPlus потокобезопасной для чтения нескольких листов в одном файле Excel?
    Anonymous » » в форуме C#
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Является ли библиотека С# EPPlus потокобезопасной для чтения нескольких листов в одном файле Excel?
    Anonymous » » в форуме C#
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»