2011-07-18 9 views

Respuesta

28

Sí, es seguro para hilos y sí, le evita usar cerraduras por todas partes (lo que sea que eso signifique). Por supuesto, eso solo le proporcionará un acceso seguro a los hilos de los datos almacenados en este diccionario, pero si los datos en sí no son seguros para hilos, entonces necesita sincronizar el acceso a ellos, por supuesto. Imagine, por ejemplo, que ha almacenado en este caché un List<T>. Ahora thread1 obtiene esta lista (de una manera segura para hilos, ya que el diccionario simultáneo le garantiza esto) y luego comienza a enumerar sobre esta lista. Exactamente al mismo tiempo, thread2 obtiene esta misma lista de la caché (de una manera segura para hilos, ya que el diccionario simultáneo le garantiza esto) y escribe en la lista (por ejemplo, agrega un valor). Conclusión: si no ha sincronizado thread1, tendrá problemas.

En lo que se refiere a usarlo como caché, bueno, probablemente no sea una buena idea. Para el almacenamiento en caché, te recomendaría lo que ya está incorporado en el marco. Clases como MemoryCache por ejemplo. La razón de esto es que lo que está integrado en el ensamblaje System.Runtime.Caching está, explícitamente, construido para el almacenamiento en caché => maneja cosas como la expiración automática de datos si comienza a ejecutar poca memoria, devoluciones de llamadas para los elementos de caducidad de caché, e incluso estaría capaz de distribuir su caché en varios servidores usando cosas como memcached, AppFabric, ..., todo lo que no podría soñar con un diccionario simultáneo.

+2

¿La clase MemoryCache es segura para subprocesos como el ConcurrentDictionary? – michael

+1

@michael, sí, es seguro para subprocesos, pero es absolutamente el mismo comentario sobre la sincronización de acceso a objetos que no son seguros para subprocesos y que podría estar almacenando en este caché. –

+0

Oh, entiendo esa parte. Pero, para que otros lectores puedan entender, lo voy a reiterar. Usted dice que las clases 'ConcurrentDictionary' y' MemoryCache' son seguras para hilos, pero no se garantiza que los contenidos estén dentro de subprocesos. :) – michael

3

Puede que tenga que usar el bloqueo de la misma manera que puede necesitar una transacción en una base de datos. La parte "concurrente" significa que el diccionario continuará funcionando correctamente en varios hilos.

Incorporado en la colección concurrente están TryGetValue y TryRemove que reconocen que alguien podría eliminar un elemento primero. El bloqueo en un nivel granular está incorporado, pero aún necesita pensar qué hacer en estas situaciones. Para el almacenamiento en caché, a menudo no importa, es decir, es una operación idempotente.

re: almacenamiento en caché. I siente que depende de lo que está almacenando en el caché + lo que está haciendo con él. Hay costos de lanzamiento asociados con el uso de un objeto. Probablemente para la mayoría de las cosas basadas en la web, MemCache se adapta mejor como se sugirió anteriormente.

Cuestiones relacionadas