Raccolte thread-safeThread-Safe Collections

.NET Framework 4.NET Framework 4 introduce lo spazio dei nomi System.Collections.Concurrent, che include diverse classi di raccolta sia thread-safe che scalabili.The .NET Framework 4.NET Framework 4 introduces the System.Collections.Concurrent namespace, which includes several collection classes that are both thread-safe and scalable. Più thread possono aggiungere o rimuovere elementi da queste raccolte in modo sicuro ed efficiente, senza richiedere una sincronizzazione aggiuntiva nel codice utente.Multiple threads can safely and efficiently add or remove items from these collections, without requiring additional synchronization in user code. Quando si scrive nuovo codice, usare le classi di raccolta simultanee ogni volta che la raccolta verrà scritta contemporaneamente su più thread.When you write new code, use the concurrent collection classes whenever the collection will be writing to multiple threads concurrently. Se si prevede di leggere solo da una raccolta condivisa, è possibile usare le classi dello spazio dei nomi System.Collections.Generic.If you are only reading from a shared collection, then you can use the classes in the System.Collections.Generic namespace. È consigliabile evitare di usare le classi di raccolta 1.0 a meno che non sia necessario definire come destinazione il runtime di .NET Framework versione 1.1 o precedente.We recommend that you do not use 1.0 collection classes unless you are required to target the .NET Framework 1.1 or earlier runtime.

Sincronizzazione dei thread nelle raccolte di .NET Framework 1.0 e 2.0Thread Synchronization in the .NET Framework 1.0 and 2.0 Collections

Le raccolte introdotte in .NET Framework 1.0 sono reperibili nello spazio dei nomi System.Collections.The collections introduced in the .NET Framework 1.0 are found in the System.Collections namespace. Queste raccolte, incluse le raccolte ArrayList e Hashtable usate normalmente, supportano la thread safety con la proprietà Synchronized, che restituisce un wrapper thread-safe per la raccolta.These collections, which include the commonly used ArrayList and Hashtable, provide some thread-safety through the Synchronized property, which returns a thread-safe wrapper around the collection. Il wrapper funziona bloccando l'intera raccolta in ogni operazione di aggiunta o rimozione.The wrapper works by locking the entire collection on every add or remove operation. Pertanto, ogni thread che tenta di accedere alla raccolta deve attendere il proprio turno per acquisire l'unico blocco.Therefore, each thread that is attempting to access the collection must wait for its turn to take the one lock. Questa caratteristica non è scalabile e può causare un peggioramento delle prestazioni per le raccolte di grandi dimensioni.This is not scalable and can cause significant performance degradation for large collections. Inoltre, la progettazione non è completamente protetta da race condition.Also, the design is not completely protected from race conditions. Per altre informazioni, vedere la pagina relativa alla sincronizzazione nelle raccolte generiche.For more information, see Synchronization in Generic Collections.

Le classi di raccolta introdotte in .NET Framework 2.0 sono reperibili nello spazio dei nomi System.Collections.Generic.The collection classes introduced in the .NET Framework 2.0 are found in the System.Collections.Generic namespace. Sono incluse List<T>, Dictionary<TKey,TValue> e così via.These include List<T>, Dictionary<TKey,TValue>, and so on. che forniscono maggiore indipendenza dai tipi e migliori prestazioni rispetto alle classi di .NET Framework 1.0.These classes provide improved type safety and performance compared to the .NET Framework 1.0 classes. Tuttavia, le classi di raccolta di .NET Framework 2.0 non forniscono la sincronizzazione dei thread. Quando gli elementi vengono aggiunti o rimossi contemporaneamente su più thread, la sincronizzazione deve essere gestita dal codice utente.However, the .NET Framework 2.0 collection classes do not provide any thread synchronization; user code must provide all synchronization when items are added or removed on multiple threads concurrently.

È quindi consigliabile usare le classi della raccolta simultanee in .NET Framework 4.NET Framework 4 perché forniscono non solo l'indipendenza dai tipi delle classi di raccolta di .NET Framework 2.0, ma anche una thread safety più efficiente e completa rispetto alle raccolte .NET Framework 1.0.NET Framework 1.0.We recommend the concurrent collections classes in the .NET Framework 4.NET Framework 4 because they provide not only the type safety of the .NET Framework 2.0 collection classes, but also more efficient and more complete thread safety than the .NET Framework 1.0.NET Framework 1.0 collections provide.

Blocco con granularità fine e meccanismi senza bloccoFine-Grained Locking and Lock-Free Mechanisms

Alcuni tipi di raccolte simultanee usano meccanismi di sincronizzazione leggeri, ad esempio SpinLock, SpinWait, SemaphoreSlim e CountdownEvent, che sono nuovi in .NET Framework 4.NET Framework 4.Some of the concurrent collection types use lightweight synchronization mechanisms such as SpinLock, SpinWait, SemaphoreSlim, and CountdownEvent, which are new in the .NET Framework 4.NET Framework 4. Questi tipi di sincronizzazione usano in genere la rotazione con stato occupato per breve periodi di tempo prima di impostare il thread in uno stato di attesa effettivo.These synchronization types typically use busy spinning for brief periods before they put the thread into a true Wait state. Quando si prevedono tempi di attesa molto brevi, la rotazione è molto meno dispendiosa a livello di elaborazione rispetto all'attesa, che implica una transizione del kernel complessa.When wait times are expected to be very short, spinning is far less computationally expensive than waiting, which involves an expensive kernel transition. Per le classi di raccolta che usano la rotazione, questo livello di efficienza significa che più thread possono aggiungere e rimuovere elementi con una frequenza molto elevata.For collection classes that use spinning, this efficiency means that multiple threads can add and remove items at a very high rate. Per altre informazioni sul confronto tra spin e blocco, vedere SpinLock e SpinWait.For more information about spinning vs. blocking, see SpinLock and SpinWait.

Le classi ConcurrentQueue<T> e ConcurrentStack<T> non usano alcun blocco.The ConcurrentQueue<T> and ConcurrentStack<T> classes do not use locks at all. Al contrario, si basano sulle operazioni Interlocked per ottenere la thread safety.Instead, they rely on Interlocked operations to achieve thread-safety.

Nota

Poiché supportano ICollection, le classi di raccolta simultanee offrono implementazioni per le proprietà IsSynchronized e SyncRoot, anche se queste sono irrilevanti.Because the concurrent collections classes support ICollection, they provide implementations for the IsSynchronized and SyncRoot properties, even though these properties are irrelevant. IsSynchronized restituisce sempre false e SyncRoot è sempre null (Nothing in Visual Basic).IsSynchronized always returns false and SyncRoot is always null (Nothing in Visual Basic).

Nella tabella seguente sono elencati i tipi di raccolta dello spazio dei nomi System.Collections.Concurrent.The following table lists the collection types in the System.Collections.Concurrent namespace.

TipoType DescrizioneDescription
BlockingCollection<T> Offre la funzionalità di delimitazione e blocco per qualsiasi tipo che implementa IProducerConsumerCollection<T>.Provides bounding and blocking functionality for any type that implements IProducerConsumerCollection<T>. Per altre informazioni, vedere Panoramica di BlockingCollection.For more information, see BlockingCollection Overview.
ConcurrentDictionary<TKey,TValue> Implementazione thread-safe di un dizionario di coppie chiave-valore.Thread-safe implementation of a dictionary of key-value pairs.
ConcurrentQueue<T> Implementazione thread-safe di una coda FIFO (First-In, First-Out).Thread-safe implementation of a FIFO (first-in, first-out) queue.
ConcurrentStack<T> Implementazione thread-safe di una coda LIFO (Last-In, First-Out).Thread-safe implementation of a LIFO (last-in, first-out) stack.
ConcurrentBag<T> Implementazione thread-safe di una raccolta non ordinata di elementi.Thread-safe implementation of an unordered collection of elements.
IProducerConsumerCollection<T> Interfaccia che un tipo deve implementare per essere usato in un oggetto BlockingCollection.The interface that a type must implement to be used in a BlockingCollection.
TitoloTitle DescrizioneDescription
Panoramica di BlockingCollectionBlockingCollection Overview Descrive la funzionalità fornita dal tipo BlockingCollection<T>.Describes the functionality provided by the BlockingCollection<T> type.
Procedura: aggiungere e rimuovere elementi da un oggetto ConcurrentDictionaryHow to: Add and Remove Items from a ConcurrentDictionary Descrive come aggiungere e rimuovere elementi da un oggetto ConcurrentDictionary<TKey,TValue>Describes how to add and remove elements from a ConcurrentDictionary<TKey,TValue>
Procedura: Aggiungere e rimuovere singoli elementi di un oggetto BlockingCollectionHow to: Add and Take Items Individually from a BlockingCollection Descrive come aggiungere e recuperare elementi da una raccolta di blocco senza usare l'enumeratore di sola lettura.Describes how to add and retrieve items from a blocking collection without using the read-only enumerator.
Procedura: Aggiungere funzionalità di delimitazione e blocco a una raccoltaHow to: Add Bounding and Blocking Functionality to a Collection Descrive come usare una classe di raccolta come meccanismo di archiviazione sottostante per una raccolta IProducerConsumerCollection<T>.Describes how to use any collection class as the underlying storage mechanism for an IProducerConsumerCollection<T> collection.
Procedura: utilizzare ForEach per rimuovere elementi in un oggetto BlockingCollectionHow to: Use ForEach to Remove Items in a BlockingCollection Descrive come usare foreach (For Each in Visual Basic) per rimuovere tutti gli elementi in una raccolta di blocco.Describes how to use foreach, (For Each in Visual Basic) to remove all items in a blocking collection.
Procedura: utilizzare matrici di raccolte di blocco in una pipelineHow to: Use Arrays of Blocking Collections in a Pipeline Descrive come usare più raccolte di blocco contemporaneamente per implementare una pipeline.Describes how to use multiple blocking collections at the same time to implement a pipeline.
Procedura: Creare un pool di oggetti con un oggetto ConcurrentBagHow to: Create an Object Pool by Using a ConcurrentBag Illustra come usare un contenitore simultaneo per migliorare le prestazioni negli scenari in cui è possibile riutilizzare gli oggetti anziché crearne continuamente di nuovi.Shows how to use a concurrent bag to improve performance in scenarios where you can reuse objects instead of continually creating new ones.

RiferimentiReference

System.Collections.Concurrent