2012-07-16 9 views
45

Esto es más una cuestión académica ... ¿pero puede ConcurrentDictionary.TryAdd fallar? Y si es así, ¿en qué casos y por qué?¿Puede ConcurrentDictionary.TryAdd fallar?

+0

Tal como está, esta pregunta es bastante vaga. MSDN [página] (http://msdn.microsoft.com/en-us/library/dd267291.aspx) documenta un par de razones, excepcionales y otras (como las respuestas hasta ahora han mencionado). –

+9

Sí, y la documentación de MSDN es conocida por su claridad e impecabilidad –

+1

Bueno, parece lo suficientemente clara y perfecta para las otras respuestas. –

Respuesta

69

Sí se puede, aquí están las condiciones (from msdn):

  • ArgumentNullException - cuando la llave es referencia nula
  • OverflowException - cuando se alcanzó el número máximo de elementos
  • Se devuelve falso si ya existe un elemento con la misma clave

Solo para reiterar, esto no tiene nada que ver con la simultaneidad. Si usted se preocupa alrededor de dos hilos se inserta un elemento al mismo tiempo, entonces puede ocurrir lo siguiente:

  • Ambas inserciones funcionan bien, si las claves son diferentes
  • un inserto funciona bien y devuelve verdadero, el otro inserto falla (sin excepción) y devuelve falso. Esto sucede si dos hilos intentan insertar un elemento con la misma tecla y, básicamente, solo uno podría ganar el otro.
+4

Ok ... así que no tiene nada que ver con el acceso simultáneo ... simplemente realiza las mismas comprobaciones que tendría que hacer con un diccionario estándar. –

+1

Sí, internamente utiliza la rotación de la CPU, lo que permite múltiples conexiones simultáneas. – oleksii

+0

Gracias ... Estoy aceptando su respuesta como la más constructiva. Estamos depurando un error bastante elusivo aquí y estamos descartando posibles fuentes línea por línea. Puedo descartar TryAdd en función de lo que haya contribuido (aunque aún agregaré el registro adicional en caso de que no se pueda agregar) –

6

Sure it can. Si la clave ya existe, el método devolverá falso.

Ref: http://msdn.microsoft.com/en-us/library/dd267291.aspx

Valor de retorno Tipo: System.Boolean cierto si se añadió el par clave/valor a la ConcurrentDictionary éxito. Si la clave ya existe, este método devuelve falso.

+0

Bueno ... eso es un hecho. ¿Es ese el único caso donde puede fallar? –

+0

@daveL - sí, cuando ocurren excepciones ... vea la respuesta de Oleksii. –

+0

Gracias por su ayuda. I + 1ed –

2

Fallará cuando la clave ya exista en el diccionario.

Si no se puede agregar el valor porque se ha agotado la memoria, obtendrá una excepción.

Cuestiones relacionadas