Подтвердить что ты не робот

Может ли ConcurrentDictionary.TryAdd сбой?

Это скорее академический вопрос... но может ли ConcurrentDictionary.TryAdd потерпеть неудачу? И если да, то в каких случаях и почему?

4b9b3361

Ответ 1

Да, может, вот условия (из MSDN):

  • ArgumentNullException - когда ключ является нулевой ссылкой
  • OverflowException - когда максимальное количество элементов было достигнуто
  • Возвращает false, если элемент с таким же ключом уже существует

Просто повторюсь, это не имеет ничего общего с параллелизмом. Если вы беспокоитесь о двух потоках, вставляющих элемент одновременно, то может произойти следующее:

  • Обе вставки работают нормально, если ключи разные.
  • Одна вставка работает нормально и возвращает истину, другая вставка завершается неудачно (без исключения) и возвращает ложь. Это происходит, если два потока пытаются вставить элемент с одинаковым ключом, и в основном выигрывает только один, а другой проигрывает.

Ответ 2

Конечно, это возможно. Если ключ уже существует, метод вернет false.

Ссылка: http://msdn.microsoft.com/en-us/library/dd267291.aspx

Возвращаемое значение Тип: System.Boolean true, если пара ключ/значение была успешно добавлена ​​в ConcurrentDictionary. Если ключ уже существует, этот метод возвращает false.

Ответ 3

Это не удастся, если ключ уже существует в словаре.

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