Le collezioni introdotte nel .NET Framework 1.0 si trovano nello spazio nominale System.Collections. Queste collezioni, inclusi i comunemente usati ArrayList e Hashtable, forniscono una sorta di sicurezza dei thread tramite la proprietà Synchronized, che restituisce un wrapper thread-safe correlato alla collezione. Il wrapper funziona bloccando l'intero set per ogni operazione di aggiunta o rimozione. Pertanto, ogni thread che cerca di accedere alla collezione deve aspettare il suo turno per acquisire il lock. Questo non è scalabile e comporterà un significativo degrado delle prestazioni per collezioni di grandi dimensioni. Inoltre, questo design non impedisce completamente la contesa. Per ulteriori informazioni, consulta la seguente pagina sul sito MSDN: Sincronizzazione nelle collezioni generiche
La classe di raccolta introdotta nel .NET Framework 2.0 si trova nello spazio nominale System.Collections.Generic. Queste classi di raccolta includono Lista<T>, Dizionario< TKey, TValue> ecc. Queste classi offrono una maggiore sicurezza dei tipi e prestazioni rispetto alle classi di .NET Framework 1.0. Tuttavia, la classe di raccolta .NET Framework 2.0 non fornisce alcuna sincronizzazione dei thread; Quando si aggiungono o si rimuovono elementi su più thread contemporaneamente, il codice utente deve fornire tutta la sincronizzazione.
Raccomandiamo di utilizzare classi di raccolta concorrente in .NET Framework 4 perché offrono non solo la sicurezza dei tipi delle classi di raccolta di .NET Framework 2.0, ma anche una sicurezza dei thread più efficiente e completa rispetto a quella fornita dalla collezione .NET Framework 1.0.
Alcuni tipi di collezione concorrente utilizzano meccanismi di sincronizzazione leggeri come SpinLock, SpinWait, SemaphoreSlim e CountdownEvent, che sono nuovi nel .NET Framework 4. Tipicamente, i tipi di sincronizzazione sopra elencati utilizzano la "rotazione occupata" per un breve periodo di tempo prima di mettere il thread nello stato effettivamente in attesa. Se il tempo di attesa è previsto molto breve, lo spin consumerà molte meno risorse di calcolo rispetto all'attesa, il che comporta conversioni di kernel che consumeranno molte risorse. Per le classi di collezione che utilizzano la rotazione, questa efficienza significa che più thread possono aggiungere e rimuovere elementi a un ritmo molto veloce. Per maggiori informazioni su limitazione e blocco, vedi SpinLock e SpinWait. Le<T> classi ConcurrentQueue e ConcurrentStack<T> non usano affatto i lock. Invece, si affidano a operazioni Interlock per la sicurezza dei thread.
illustrare
Poiché le classi di raccolta concorrenti supportano ICollection, forniscono implementazioni per le proprietà IsSynchronized e SyncRoot, anche se non correlate. IsSynchronized restituisce sempre false parole, mentre SyncRoot è sempre nullo (nulla in Visual Basic).
La tabella seguente elenca i tipi di collezione nello spazio di nomi System.Collections.Concurrent.
digitare | descrizione | BlockingCollection<T> | Fornisce<T> qualsiasi tipo di limitazione e blocco per l'implementazione di IProducerConsumerCollection. Per maggiori informazioni, vedi panoramica di BlockingCollection. | DizionarioConcurrente<TKey, TValue> | Key/value è un'implementazione thread-safe del dizionario. | ConcurrentQueue<T> | Implementazione della sicurezza dei thread nelle code FIFO (first in, first out). | ConcurrentStack<T> | Implementazione thread-safe degli stack LIFO (last-in, first-out). | ConcurrentBag<T> | Implementazione thread-safe di una collezione di elementi fuori ordine. | IProducerConsumerCollection<T> | i tipi devono essere implementati inBlockingCollectionInterfacce utilizzate nel
|
|