Como MSDN saysConcurrentDictionary <TKey,TValue> vs Diccionario <TKey,TValue>
ConcurrentDictionary<TKey, TValue>
clase representa una colección thread-safe de pares de valores clave que se puede acceder por múltiples hilos simultáneamente.
Pero como sé, las clases System.Collections.Concurrent
están diseñadas para PLINQ.
Tengo Dictionary<Key,Value>
que mantiene clientes en línea en el servidor, y lo hago seguro mediante el bloqueo de objeto cuando tengo acceso a él.
¿Puedo reemplazar con seguridad Dictionary<TKey,TValue>
por ConcurrentDictionary<TKey,TValue>
en mi caso? ¿aumentará el rendimiento después del reemplazo?
Here en la parte 5 José Albahari indican que diseñó para la programación paralela
- Las colecciones concurrentes están sintonizados para la programación paralela. Las colecciones convencionales las superan en todos los escenarios, excepto en los altamente concurrentes.
- Una recopilación segura de subprocesos no garantiza que el código que la utilice sea seguro para subprocesos.
- Si enumera sobre una colección concurrente mientras otro hilo la modifica, no se lanza ninguna excepción. En cambio, obtienes una mezcla de contenido antiguo y nuevo.
- No hay una versión concurrente de List.
- Las clases concurrentes de pila, cola y bolsa se implementan internamente con listas vinculadas. Esto los hace menos eficientes en la memoria que las clases de Stack y Queue no concurrentes, pero es mejor para el acceso simultáneo porque las listas enlazadas son propicias para implementaciones sin bloqueo o bajo bloqueo. (Esto se debe a la inserción de un nodo en una lista enlazada es necesario actualizar sólo un par de referencias, mientras que la inserción de un elemento en una estructura de lista similar puede requerir que se mueven miles de elementos existentes.)
No estoy al tanto del hecho de que las clases de System.Collections.Concurrent están "diseñadas para PLINQ", ¿de dónde sacas esa idea? – BrokenGlass
@BrokenGlass: Tal vez en el sentido de que los tipos de lambda y anónimos están "diseñados para LINQ"; llegaron a estar en el marco * debido a * LINQ, pero definitivamente tienen aplicabilidad más allá. –
@BrokenGlass y @Adam Robinson, consulte la publicación editada –