Parallelismo dei dati (Task Parallel Library)

Con l'espressione parallelismo dei dati ci si riferisce a scenari in cui la stessa operazione viene eseguita contemporaneamente (ovvero in parallelo) sugli elementi di una matrice o una raccolta di origine. Nelle operazioni in parallelo su dati la raccolta di origine viene suddivisa in partizioni in modo che più thread possano agire simultaneamente su segmenti diversi.

La libreria Task Parallel Library (TPL) supporta il parallelismo dei dati tramite la classe System.Threading.Tasks.Parallel. Questa classe fornisce le implementazioni in parallelo basate su metodo dei cicli for e foreach (For e For Each in Visual Basic). La scrittura della logica di un ciclo Parallel.For o Parallel.ForEach è molto simile a quella della logica di un ciclo sequenziale. Non è necessario creare thread o accodare elementi di lavoro. Nei cicli di base non è necessario acquisire blocchi. La libreria TPL gestisce automaticamente tutto il lavoro di basso livello. Per informazioni dettagliate sull'uso di Parallel.For e Parallel.ForEach, scaricare il documento Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4 (Modelli per la programmazione parallela: informazioni sui modelli paralleli con .NET Framework 4 e su come applicarli). L'esempio di codice seguente mostra un ciclo foreach semplice e il relativo equivalente parallelo.

Nota

Questa documentazione usa espressioni lambda per definire delegati in TPL. Se non si ha familiarità con le espressioni lambda in C# o Visual Basic, vedere Espressioni lambda in PLINQ e TPL.

// Sequential version
foreach (var item in sourceCollection)
{
    Process(item);
}

// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
' Sequential version        
For Each item In sourceCollection
    Process(item)
Next

' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))

Quando viene eseguito un ciclo parallelo, la libreria TPL esegue il partizionamento dell'origine dati in modo che il ciclo possa agire simultaneamente su più parti. L'utilità di pianificazione esegue automaticamente il partizionamento dell'attività in base alle risorse di sistema e al carico di lavoro. Quando risulta possibile, se si verifica uno sbilanciamento del carico di lavoro, l'utilità di pianificazione ridistribuisce il lavoro fra più thread e processori.

Nota

È anche possibile fornire un partitioner o un'utilità di pianificazione personalizzata, Per altre informazioni, vedere Partitioner personalizzati per PLINQ e TPL e Utilità di pianificazione delle attività.

Sia il metodo Parallel.For sia il metodo Parallel.ForEach presentano vari overload che consentono di arrestare o interrompere l'esecuzione del ciclo, monitorare lo stato del ciclo in altri thread, gestire lo stato di thread locale, completare gli oggetti di thread locali, controllare il livello di concorrenza e così via. I tipi di supporto che consentono di utilizzare queste funzionalità prevedono ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken e CancellationTokenSource.

Per altre informazioni, vedere il Documento contenente una panoramica dei modelli per la programmazione parallela, ovvero come comprendere e applicare modelli paralleli con .NET Framework 4.

Il parallelismo dei dati con sintassi dichiarativa o di tipo query è supportato da PLINQ. Per altre informazioni, vedere Parallel LINQ (PLINQ).

Posizione Descrizione
Procedura: scrivere un ciclo Parallel.For semplice Descrive come scrivere un ciclo For su qualsiasi matrice o raccolta dell'origine IEnumerable<T> indicizzabile.
Procedura: scrivere un ciclo Parallel.ForEach semplice Descrive come scrivere un ciclo ForEach su qualsiasi raccolta di origine IEnumerable<T>.
Procedura: arrestare o interrompere un ciclo Parallel.For Descrive come arrestare o interrompere un ciclo parallelo in modo che tutti i thread siano informati dell'azione.
Procedura: scrivere un ciclo Parallel.For con variabili di thread locali Descrive come scrivere un ciclo For in cui ogni thread gestisce una variabile privata che non è visibile a qualsiasi altro thread e come sincronizzare i risultati di tutti i thread quando il ciclo viene completato.
Procedura: Scrivere un ciclo Parallel.ForEach con variabili di partizione locali Descrive come scrivere un ciclo ForEach in cui ogni thread gestisce una variabile privata che non è visibile a qualsiasi altro thread e come sincronizzare i risultati di tutti i thread quando il ciclo viene completato.
Procedura: annullare un ciclo Parallel.For o ForEach Descrive come annullare un ciclo parallelo tramite un oggetto System.Threading.CancellationToken.
Procedura: aumentare la velocità di corpi di ciclo di dimensioni ridotte Descrive come aumentare la velocità di esecuzione nel caso di un corpo di ciclo molto piccolo.
Task Parallel Library (TPL) Contiene la panoramica di Task Parallel Library.
Programmazione parallela Introduce la Programmazione parallela in .NET Framework.

Vedi anche