Вы не делаете что-то не так. MSDN не так. Application.LoadComponent не является потокобезопасным. На мой взгляд, это ошибка в WPF.
Проблема в том, что всякий раз, когда Application.LoadComponent загружает «Часть» из «Пакета», она:
- Проверяет свой внутренний кэш для пакета, чтобы видеть, загружена ли часть, и возвращает его, если найден
- Загружает деталь из файла
- Добавляет его во внутренний кеш
- Возвращает
У вас есть два потока, вызывающих Application.LoadComponent
, чтобы загрузить одну и ту же деталь одновременно. В документации MSDN сказано, что это нормально, но происходит следующее:
- Поток # 1 проверяет кэш и начинает загрузку из файла
- Поток # 2 проверяет кэш и начинает загрузку из файла
- Поток # 1 завершает загрузку из файла и добавляет в кеш
- Поток # 2 завершает загрузку из файла и пытается добавить его в кэш, что приводит к исключению дублирующегося ключа
Обходной путь для ошибки - заключить все вызовы Application.LoadComponent внутри lock ().
Ваш объект блокировки может быть создан таким образом в вашем App.cs или в другом месте (на ваш выбор):
public static object MyLoadComponentLock = new Object();
Тогда ваш вызов LoadComponent выглядит следующим образом:
lock(App.MyLoadComponentLock)
genericDictionary = (ResourceDictionary)Application.LoadComponent(...