web-dev-qa-db-fra.com

ConcurrentDictionary.TryAdd peut-il échouer?

C'est plus une question académique ... mais peut ConcurrentDictionary.TryAdd échouer? Et si oui dans quels cas et pourquoi?

62
Dave Lawrence

Oui c'est possible, voici les conditions ( de msdn ):

  • ArgumentNullException - lorsque la clé est une référence nulle
  • OverflowException - lorsque le nombre maximal d'éléments a été atteint
  • Il retourne faux si un élément avec la même clé existe déjà

Pour rappel, cela n'a rien à voir avec la concurrence. Si vous craignez que deux threads insèrent un élément en même temps, les événements suivants peuvent se produire:

  • Les deux inserts fonctionnent bien, si les clés sont différentes.
  • Un insert fonctionne correctement et renvoie true, l'autre insert échoue (sans exception) et renvoie false. Cela se produit si deux threads tentent d'insérer un élément avec la même clé et qu'un seul gagnerait et l'autre perdrait.
91
oleksii

Bien sûr que c'est possible. Si la clé existe déjà, la méthode retournera false.

Réf: http://msdn.Microsoft.com/en-us/library/dd267291.aspx

Type de valeur de retour: System.Boolean true si la paire clé/valeur a été ajoutée au ConcurrentDictionary avec succès. Si la clé existe déjà, cette méthode retourne false.

7
Chris Gessler

Il échouera lorsque la clé existe déjà dans le dictionnaire.

Si la valeur ne peut pas être ajoutée car vous manquez de mémoire, vous obtiendrez une exception à la place.

2
Guffa