2011-11-18 9 views
12

Si tengo unhilo de seguridad con diccionario

Dictionary<int, StreamReader> myDic = new Dictionary<int, StreamReader> 
//Populate dictionary 

Un hilo hace

myDic[0] = new StreamReader(path); 

Otro hilo hace

myDic[1] = new StreamReader(otherpath) 

¿Este hilo de seguridad debido a que el artículo real en el diccionario conseguir modificado es diferente al que está en el otro hilo o recibiré un InvalidOperationException: Collection was modified

Respuesta

18

Solo obtendrá InvalidOperationException: Collection was modified si enumera el diccionario mientras modifica.

Sin embargo, eso no es seguro para subprocesos.
Si una de esas operaciones hace que el diccionario cambie de tamaño, la otra puede perderse.
En su lugar, use ConcurrentDictionary.

+0

, ¿Qué pasa si tengo cuncorrentDictionary y tengo que comprobar containsKey y luego hacer algo si es cierto: entonces todavía tendría que bloquearlo: 'bloqueo (taquilla) { si (MyConDic.ContainsKey (toUserName)) {...}} '.... ¿no? –

+0

@RoyiNamir: Eso vence todo el propósito de 'ConcurrentDictionary'. Use sus API – SLaks

+0

¿Pero quién garantiza que en la línea 96 no habrá otro hilo que agregará el entery? Http: //i.stack.imgur.com/MwDuU.jpg? por favor, elabore –

1

Para mejorar su código, es posible que desee buscar la clase ConcurrentDictionary. Resolverá algunos problemas con multi-threading.

5

System.Collections.Generic Las colecciones son solo seguras para subprocesos si está leyendo desde varios subprocesos.

Citando de MSDN

clases de colección System.Collections.Generic no proporcionan ninguna sincronización de hilos; código de usuario debe proporcionar toda la sincronización cuando se añaden o eliminan en varios subprocesos simultáneamente

Si quieres que desee hilo de seguridad tanto para las operaciones de lectura y escritura considerar el uso de System.Collections.Concurrent

* Cuando se escribe nuevo código de elementos, utilice el clases de recopilación concurrentes siempre que la recopilación se escriba en varios subprocesos al mismo tiempo. *

Cuestiones relacionadas