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.