Проблема: Мне нужно реализовать кеш объектов. Кэш должен быть потокобезопасным и должен заполнять значения по требованию (ленивая загрузка). Значения извлекаются через веб-службу с помощью клавиши (медленная работа). Поэтому я решил использовать ConcurrentDictionary
и метод GetOrAdd(), который имеет метод factory, предполагающий, что операция является атомарной и синхронизированной. К сожалению, в статье MSDN я нашел следующее выражение: Как добавить и удалить элементы из ConcurrentDictionary:
Кроме того, хотя все методы ConcurrentDictionary являются поточно-безопасный, не все методы являются атомарными, в частности GetOrAdd и AddOrUpdate. Делегат пользователя, который передается этим методам, вызывается вне внутренней блокировки словаря.
Хорошо, что несчастный, но все равно не отвечает на мой ответ полностью.
Вопрос: Вызывается ли значение factory только один раз за ключ? В моем конкретном случае: возможно ли, что несколько потоков, которые ищут один и тот же ключ, порождают несколько запросов к веб-службе для одного и того же значения?