Это скорее академический вопрос... но может ли ConcurrentDictionary.TryAdd потерпеть неудачу? И если да, то в каких случаях и почему?
Может ли ConcurrentDictionary.TryAdd сбой?
Ответ 1
Да, может, вот условия (из MSDN):
- ArgumentNullException - когда ключ является нулевой ссылкой
- OverflowException - когда максимальное количество элементов было достигнуто
- Возвращает false, если элемент с таким же ключом уже существует
Просто повторюсь, это не имеет ничего общего с параллелизмом. Если вы беспокоитесь о двух потоках, вставляющих элемент одновременно, то может произойти следующее:
- Обе вставки работают нормально, если ключи разные.
- Одна вставка работает нормально и возвращает истину, другая вставка завершается неудачно (без исключения) и возвращает ложь. Это происходит, если два потока пытаются вставить элемент с одинаковым ключом, и в основном выигрывает только один, а другой проигрывает.
Ответ 2
Конечно, это возможно. Если ключ уже существует, метод вернет false.
Ссылка: http://msdn.microsoft.com/en-us/library/dd267291.aspx
Возвращаемое значение Тип: System.Boolean true, если пара ключ/значение была успешно добавлена в ConcurrentDictionary. Если ключ уже существует, этот метод возвращает false.
Ответ 3
Это не удастся, если ключ уже существует в словаре.
Если значение не может быть добавлено, поскольку вы исчерпали память, вы получите исключение.