41

In che modo lo e gli insiemi simultanei nello spazio dei nomi System.Collections.Concurrent differiscono gli uni dagli altri, a parte le raccolte simultanee come spazio dei nomi e SynchronizedCollection<T> come classe?Qual è la differenza tra SynchronizedCollection <T> e le altre raccolte simultanee?

SynchronizedCollection<T> e tutte le classi in Concurrent Collections forniscono raccolte thread-safe. Come decido quando utilizzarne uno e perché?

+1

Date un'occhiata qui: http://stackoverflow.com/questions/1946520/why-are-there-no-concurrent-collections-in-c – StuartLC

risposta

50

Il SynchronizedCollection<T> class è stato introdotto per primo in .NET 2.0 per fornire una classe di raccolta thread-safe. Lo fa tramite il blocco in modo da avere essenzialmente un List<T> in cui ogni accesso è racchiuso in un'istruzione lock.

Lo spazio dei nomi System.Collections.Concurrent è molto più recente. Non è stato introdotto fino a .NET 4.0 e include una serie di scelte sostanzialmente migliorata e più diversificata. Queste classi non usano più i lock per garantire la sicurezza dei thread, il che significa che dovrebbero scalare meglio in una situazione in cui più thread accedono ai loro dati contemporaneamente. Tuttavia, una classe che implementa l'interfaccia IList<T> è in particolare assente tra queste opzioni.

Pertanto, se si desidera utilizzare la versione 4.0 di .NET Framework, è consigliabile utilizzare una delle raccolte fornite dallo spazio dei nomi System.Collections.Concurrent quando possibile. Proprio come con la scelta tra i vari tipi di collezioni fornite nello System.Collections.Generic namespace, dovrai scegliere quello le cui caratteristiche e caratteristiche si adattano meglio alle tue esigenze specifiche.

Se si sta prendendo di mira una versione precedente di .NET Framework o si richiede una classe di raccolta che implementa l'interfaccia IList<T>, è necessario optare per la classe SynchronizedCollection<T>.

Questo articolo su MSDN è anche la pena di leggere: When to Use a Thread-Safe Collection

+0

Quindi, preferisco System.Collections.Concurrent su SynchrinozedCollecction mentre sto usando la versione 4.0 !! – Batrickparry

+1

Se queste nuove raccolte Concurrent non utilizzano i blocchi per la sicurezza dei thread, come si ottiene la concorrenza? – Matt

+2

@Matt: vari modi. La risposta è probabilmente abbastanza complicata da meritare la sua stessa domanda. Ma per l'ispirazione, guarda qui: http://stackoverflow.com/questions/1688870/how-might-a-class-like-nets-concurrentbagt-be-implemented e qui: http://stackoverflow.com/questions/4785622/why-is-concurrentbagt-so-slow-in-net-4-0-am-i-doing-it-wrong (Inoltre, hai letto l'articolo MSDN a cui mi sono collegato? Fornisce un riassunto molto breve del trucchi che usano invece di bloccare, anche se probabilmente non abbastanza per scrivere la tua implementazione.) –

Problemi correlati