Один из вариантов - использовать ConcurrentDictionary или ImmutableDictionary .
ConcurrentDictionary
s Ключи средство доступа возвращает копию коллекции ключейкоторый вы можете проверить, даже если другой код изменяет исходный словарь.
Примечание 1. Словарь doco (не параллельный вариант) явно говорит о безопасности потоков и ситуации, которую вы достигли
(. ..) перечисление через коллекцию по сути не является потокобезопасной процедурой. В редком случае, когда перечисление конкурирует с доступом для записи, коллекция должна быть заблокирована в течение всего перечисления.
Я рекомендую прочитать весь короткий раздел в Словаре Thread Safety .
Примечание 2. Вы можете поддаться искушению на ToList()
source.Keys
, что улучшит ситуацию (в большинстве случаев исключение, похоже, исчезнет), но это не решит проблему навсегда.