2011-11-18 12 views
12

Se ho un filoDiscussione con dizionario

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

Uno fa

myDic[0] = new StreamReader(path); 

Un altro thread fa

myDic[1] = new StreamReader(otherpath) 

È questo thread-safe perché l'elemento reale nel dizionario ottenere modificato è diverso da quello sull'altro thread o otterrò un InvalidOperationException: Collection was modified

risposta

18

Si otterrà solo InvalidOperationException: Collection was modified se si elencare il dizionario durante la modifica.

Tuttavia, questo non è thread-safe.
Se una di queste operazioni causa il ridimensionamento del dizionario, l'altro potrebbe andare perso.
Utilizzare invece ConcurrentDictionary.

+0

, cosa succede se ho cuncorrentDictionary e ho bisogno di controllare containsKey e poi fare qualcosa se è vero: allora ancora avrei dovuto bloccarlo: 'blocco (armadietto) { se (MyConDic.ContainsKey (toUserName)) {...}} '.... no? –

+0

@RoyiNamir: Ciò sconfigge l'intero scopo di "ConcurrentDictionary". Usa le sue API – SLaks

+0

Ma chi garantisce che nella riga 96 non ci sarà un altro thread che aggiungerà l'entery? Http: //i.stack.imgur.com/MwDuU.jpg? si prega di elaborare –

1

Per migliorare il codice, è possibile cercare la classe ConcurrentDictionary. Risolverà alcuni problemi con il multi-threading.

5

System.Collections.Generic le raccolte sono thread safe solo se si sta leggendo da più thread.

Citando MSDN

classi collezione System.Collections.Generic non forniscono alcuna sincronizzazione filo; codice utente deve fornire tutte sincronizzazione quando vengono aggiunti o rimossi su più thread contemporaneamente

Se si desidera desiderare filo di sicurezza sia per le operazioni di lettura e scrittura considerare l'utilizzo System.Collections.Concurrent

* Quando si scrive nuovo codice elementi, utilizzare la classi di raccolta simultanee ogni volta che la raccolta scriverà su più thread contemporaneamente. *