Strutture di dati per la programmazione in paralleloData Structures for Parallel Programming

In .NET Framework versione 4 sono stati introdotti diversi nuovi tipi utili nella programmazione parallela, inclusi un set di classi di raccolta simultanee, primitive di sincronizzazione leggera e tipi per l'inizializzazione differita.The .NET Framework version 4 introduces several new types that are useful in parallel programming, including a set of concurrent collection classes, lightweight synchronization primitives, and types for lazy initialization. È possibile usare questi tipi con qualsiasi codice dell'applicazione multithreading, inclusi Task Parallel Library e PLINQ.You can use these types with any multithreaded application code, including the Task Parallel Library and PLINQ.

Classi di raccolta simultaneeConcurrent Collection Classes

Le classi di raccolta nello spazio dei nomi System.Collections.Concurrent consentono di eseguire operazioni di aggiunta e rimozione thread-safe che, ove possibile, evitano i blocchi e, dove i blocchi sono necessari, usano quelli con granularità fine.The collection classes in the System.Collections.Concurrent namespace provide thread-safe add and remove operations that avoid locks wherever possible and use fine-grained locking where locks are necessary. Diversamente dalle raccolte introdotte in .NET Framework versioni 1.0 e 2.0, in una classe di raccolta simultanea non è necessario che il codice utente acquisisca alcun blocco quando accede agli elementi.Unlike collections that were introduced in the .NET Framework versions 1.0 and 2.0, a concurrent collection class does not require user code to take any locks when it accesses items. Le classi di raccolta simultanee possono migliorare considerevolmente le prestazioni rispetto a tipi come System.Collections.ArrayList e System.Collections.Generic.List<T> (con il blocco implementato dall'utente) negli scenari in cui più thread aggiungono e rimuovono elementi da una raccolta.The concurrent collection classes can significantly improve performance over types such as System.Collections.ArrayList and System.Collections.Generic.List<T> (with user-implemented locking) in scenarios where multiple threads add and remove items from a collection.

Nella tabella seguente vengono elencate le nuove classi di raccolta simultanee:The following table lists the new concurrent collection classes:

TipoType DescrizioneDescription
System.Collections.Concurrent.BlockingCollection<T> Fornisce funzionalità di blocco e limitazione per le raccolte thread-safe che implementano System.Collections.Concurrent.IProducerConsumerCollection<T>.Provides blocking and bounding capabilities for thread-safe collections that implement System.Collections.Concurrent.IProducerConsumerCollection<T>. I thread producer vengono bloccati se non sono disponibili slot o se la raccolta è completa.Producer threads block if no slots are available or if the collection is full. I thread consumer vengono bloccati se la raccolta è vuota.Consumer threads block if the collection is empty. Questo tipo supporta anche l'accesso che non causa blocchi da parte di consumer e producer.This type also supports non-blocking access by consumers and producers. BlockingCollection<T> può essere usata come classe di base o archivio di backup per fornire funzionalità di blocco limitazione per le classi di raccolta che supportano IEnumerable<T>.BlockingCollection<T> can be used as a base class or backing store to provide blocking and bounding for any collection class that supports IEnumerable<T>.
System.Collections.Concurrent.ConcurrentBag<T> Implementazione di un contenitore thread-safe che fornisce operazioni add e get scalabili.A thread-safe bag implementation that provides scalable add and get operations.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> Tipo di dizionario simultaneo e scalabile.A concurrent and scalable dictionary type.
System.Collections.Concurrent.ConcurrentQueue<T> Coda FIFO simultanea e scalabile.A concurrent and scalable FIFO queue.
System.Collections.Concurrent.ConcurrentStack<T> Stack LIFO simultaneo e scalabile.A concurrent and scalable LIFO stack.

Per altre informazioni, vedere Raccolte thread-safe.For more information, see Thread-Safe Collections.

Primitive di sincronizzazioneSynchronization Primitives

Le nuove primitive di sincronizzazione nello spazio dei nomi System.Threading consentono la concorrenza con granularità fine e prestazioni più veloci evitando i costosi meccanismi di blocco del codice multithreading legacy.The new synchronization primitives in the System.Threading namespace enable fine-grained concurrency and faster performance by avoiding expensive locking mechanisms found in legacy multithreading code. Alcuni dei nuovi tipi, ad esempio System.Threading.Barrier e System.Threading.CountdownEvent non hanno controparti nelle versioni precedenti di .NET Framework.Some of the new types, such as System.Threading.Barrier and System.Threading.CountdownEvent have no counterparts in earlier releases of the .NET Framework.

La tabella seguente elenca i nuovi tipi di sincronizzazione:The following table lists the new synchronization types:

TipoType DescrizioneDescription
System.Threading.Barrier Consente a più thread di usare un algoritmo in parallelo fornendo un punto in cui ogni attività può segnalare il proprio arrivo e quindi venire bloccata finché non arrivano alcune o tutte le attività.Enables multiple threads to work on an algorithm in parallel by providing a point at which each task can signal its arrival and then block until some or all tasks have arrived. Per altre informazioni, vedere Barriera.For more information, see Barrier.
System.Threading.CountdownEvent Semplifica gli scenari di fork e join fornendo un agevole meccanismo di rendezvous.Simplifies fork and join scenarios by providing an easy rendezvous mechanism. Per altre informazioni, vedere CountdownEvent.For more information, see CountdownEvent.
System.Threading.ManualResetEventSlim Primitiva di sincronizzazione simile a System.Threading.ManualResetEvent.A synchronization primitive similar to System.Threading.ManualResetEvent. ManualResetEventSlim è più semplice, ma può essere usata solo per la comunicazione all'interno di un processo.ManualResetEventSlim is lighter-weight but can only be used for intra-process communication. Per altre informazioni, vedere ManualResetEvent e ManualResetEventSlim.For more information, see ManualResetEvent and ManualResetEventSlim.
System.Threading.SemaphoreSlim Primitiva di sincronizzazione che limita il numero di thread che possono accedere simultaneamente a una risorsa o a un pool di risorse.A synchronization primitive that limits the number of threads that can concurrently access a resource or a pool of resources. Per altre informazioni, vedere Semaphore e SemaphoreSlim.For more information, see Semaphore and SemaphoreSlim.
System.Threading.SpinLock Primitiva di blocco a esclusione reciproca che fa in modo che il thread che prova ad acquisire il blocco rimanga in attesa in un ciclo, o spin, per un determinato periodo di tempo prima di sospendere il quantum.A mutual exclusion lock primitive that causes the thread that is trying to acquire the lock to wait in a loop, or spin, for a period of time before yielding its quantum. Negli scenari in cui si prevede che l'attesa nel blocco sarà breve, SpinLock offre prestazioni migliori di altre forme di blocco.In scenarios where the wait for the lock is expected to be short, SpinLock offers better performance than other forms of locking. Per altre informazioni, vedere SpinLock.For more information, see SpinLock.
System.Threading.SpinWait Tipo leggero di piccole dimensioni che ruoterà per un periodo di tempo specificato e infine metterà il thread in uno stato di attesa se il numero spin viene superato.A small, lightweight type that will spin for a specified time and eventually put the thread into a wait state if the spin count is exceeded. Per altre informazioni, vedere SpinWait.For more information, see SpinWait.

Per altre informazioni, vedere:For more information, see:

Classi di inizializzazione differitaLazy Initialization Classes

Con l'inizializzazione differita, la memoria per un oggetto non viene allocata fino a quando non è necessaria.With lazy initialization, the memory for an object is not allocated until it is needed. L'inizializzazione differita può migliorare le prestazioni distribuendo le allocazioni degli oggetti in modo uniforme per l'intera durata di un programma.Lazy initialization can improve performance by spreading object allocations evenly across the lifetime of a program. È possibile abilitare l'inizializzazione differita per qualsiasi tipo personalizzato eseguendo il wrapping del tipo Lazy<T>.You can enable lazy initialization for any custom type by wrapping the type Lazy<T>.

La tabella seguente elenca i nuovi tipi di inizializzazione differita:The following table lists the lazy initialization types:

TipoType DescrizioneDescription
System.Lazy<T> Fornisce l'inizializzazione differita leggera e thread-safe.Provides lightweight, thread-safe lazy-initialization.
System.Threading.ThreadLocal<T> Fornisce un valore con inizializzazione differita per ogni thread e ogni thread richiama in modo differito la funzione di inizializzazione.Provides a lazily-initialized value on a per-thread basis, with each thread lazily-invoking the initialization function.
System.Threading.LazyInitializer Fornisce metodi statici che evitano di dover allocare un'istanza di inizializzazione differita dedicataProvides static methods that avoid the need to allocate a dedicated, lazy-initialization instance. e usano invece i riferimenti per garantire che le destinazioni siano state inizializzate quando vi si accede.Instead, they use references to ensure targets have been initialized as they are accessed.

Per altre informazioni, vedere Inizializzazione differita.For more information, see Lazy Initialization.

Eccezioni di aggregazioneAggregate Exceptions

Il tipo System.AggregateException può essere usato per acquisire più eccezioni generate simultaneamente in thread separati e restituirle al thread di unione come un'unica eccezione.The System.AggregateException type can be used to capture multiple exceptions that are thrown concurrently on separate threads, and return them to the joining thread as a single exception. I tipi System.Threading.Tasks.Task e System.Threading.Tasks.Parallel e PLINQ usano ampiamente AggregateException a questo scopo.The System.Threading.Tasks.Task and System.Threading.Tasks.Parallel types and PLINQ use AggregateException extensively for this purpose. Per altre informazioni, vedere NIB - Procedura: Gestire le eccezioni generate dalle attività e Procedura: Gestire le eccezioni in una query PLINQ.For more information, see NIB: How to: Handle Exceptions Thrown by Tasks and How to: Handle Exceptions in a PLINQ Query.

Vedere ancheSee Also

System.Collections.Concurrent
System.Threading
Programmazione parallelaParallel Programming