Condividi tramite


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 un insieme di origine. Il parallelismo dei dati con sintassi imperativa è supportato da diversi overload dei metodi For e ForEach nella classe System.Threading.Tasks.Parallel. Nelle operazioni in parallelo su dati l'insieme di origine viene suddiviso in partizioni in modo che più thread possano agire simultaneamente su segmenti diversi. La libreria 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. L'esempio di codice seguente mostra un ciclo foreach semplice e il relativo equivalente parallelo.

NotaNota

Questa documentazione utilizza 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        
For Each item In sourceCollection
    Process(item)
Next

' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
// Sequential version            
foreach (var item in sourceCollection)
{
    Process(item);
}

// Parallel equivalent
Parallel.ForEach(sourceCollection, 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.

NotaNota

È inoltre possibile fornire un partitioner o un'utilità di pianificazione personalizzata.Per ulteriori 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à includono ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken e CancellationTokenSource.

Per ulteriori informazioni, vedere Parallelismo dei dati (Task Parallel Library).

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

Argomenti correlati

Titolo

Descrizione

Procedura: scrivere un ciclo Parallel.For semplice

Viene descritto come scrivere un ciclo For su qualsiasi matrice o insieme dell'origine IEnumerable<T> indicizzabile.

Procedura: scrivere un ciclo Parallel.ForEach semplice

Viene descritto come scrivere un ciclo ForEach su qualsiasi insieme di origine IEnumerable<T>.

Procedura: arrestare o interrompere un ciclo Parallel.For

Viene descritto 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 locali dei thread

Viene descritto 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 thread locali

Viene descritto 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

Viene descritto come annullare un ciclo parallelo tramite un oggetto System.Threading.CancellationToken

Procedura: aumentare la velocità di corpi di ciclo di dimensioni ridotte

Viene descritto come aumentare la velocità di esecuzione nel caso di un corpo di ciclo molto piccolo.

Task Parallel Library

Vengono forniti i cenni preliminari su Task Parallel Library.

Programmazione parallela in .NET Framework

Viene introdotta la programmazione parallela in .NET Framework.

Vedere anche

Concetti

Programmazione parallela in .NET Framework