System.InvalidOperationException: коллекция была изменена;операция перечисления может не выполняться - PullRequest
0 голосов
/ 10 октября 2019

У меня проблема с получением временного ключа, являющегося источником, загруженным из другой функции. Обычно источник содержит от 18 до 20 ключей случайным образом. Эта проблема случается один раз в некоторое время. Как получить доступ к ключам источника без получения ошибки исключения, например " Коллекция была изменена; операция перечисления может не выполняться" .

private static IDictionary<string, BitArray> source;

public bool Check()
{
    string tempKey = source.Keys.FirstOrDefault(k => k.EndsWith(key));   
}

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Один из вариантов - использовать ConcurrentDictionary или ImmutableDictionary .

ConcurrentDictionary s Ключи средство доступа возвращает копию коллекции ключейкоторый вы можете проверить, даже если другой код изменяет исходный словарь.


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

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

Я рекомендую прочитать весь короткий раздел в Словаре Thread Safety .


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

0 голосов
/ 10 октября 2019

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

Лучший способ избежать - сначала внести изменения в коллекцию. И после выполнения всех изменений (добавление / удаление и т. Д.), Вы проверяете коллекцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...