tryadd thread safe example c# dictionary concurrentdictionary

thread - concurrentdictionary c#



¿Cuándo debo usar ConcurrentDictionary y Dictionary? (3)

Siempre estoy confundido sobre cuál de estos elegir. Como lo veo, uso el Dictionary sobre la List si quiero dos tipos de datos como Key y Value para que pueda encontrar fácilmente un valor por su key pero siempre estoy confundido si debo usar un Dictionary ConcurrentDictionary o Dictionary .

Antes de atacarme por no haber investigado mucho sobre esto, lo he intentado, pero parece que Google realmente no tiene nada en Dictionary vs ConcurrentDictionary pero tiene algo en cada uno individualmente.

Le he preguntado esto a un amigo antes, pero todo lo que dijeron es: "use ConcurrentDictionary si usa mucho su diccionario en el código" y realmente no quería molestarlos para explicárselo con mayor detalle. ¿Alguien podría ampliar esto?


"Usar ConcurrentDictionary si usa mucho su diccionario en el código" es una especie de consejo vago. No te culpo por la confusión.

ConcurrentDictionary es el uso principal en un entorno en el que actualizaría el diccionario desde varios subprocesos (o tareas asíncronas). Puede usar un Dictionary estándar desde el código que desee si se trata de un solo hilo;)

Si observa los métodos en un ConcurrentDictionary, verá algunos métodos interesantes como TryAdd , TryGetValue , TryUpdate y TryRemove .

Por ejemplo, considere un patrón típico que podría ver para trabajar con una clase de Dictionary normal.

// There are better ways to do this... but we need an example ;) if (!dictionary.ContainsKey(id)) dictionary.Add(id, value);

Esto tiene un problema ya que entre la verificación de si contiene una clave y la llamada Add un hilo diferente podría llamar Add con la misma id . Cuando este hilo llama a Add , lanzará una excepción. El método TryAdd maneja eso por usted y le devolverá un verdadero / falso que le indicará si lo agregó (o si esa clave ya estaba en el diccionario).

Entonces, a menos que esté trabajando en una sección de código de múltiples subprocesos, es probable que solo pueda usar la clase de Dictionary estándar. Dicho esto, teóricamente podría tener bloqueos para evitar el acceso simultáneo a un diccionario; esa pregunta ya está en "Bloqueo de diccionario vs. ConcurrentDictionary" .


La razón más importante para usar CocurrentDictionary sobre el Dictionary es la seguridad de subprocesos. Si su aplicación obtiene varios subprocesos utilizando el mismo diccionario al mismo tiempo, necesita CocurrentDictionary es seguro para CocurrentDictionary esto es particularmente cierto cuando estos subprocesos escriben o CocurrentDictionary el diccionario.


ConcurrentDictionary es útil cuando necesita acceder a un diccionario a través de múltiples subprocesos (es decir, multiproceso). Los objetos del Dictionary vainilla no poseen esta capacidad y, por lo tanto, solo deben usarse de una sola manera.