Condividi tramite


Parallelismo dei dati (Task Parallel Library)

Il parallelismo dei dati si riferisce a scenari in cui la stessa operazione viene eseguita simultaneamente (ovvero in parallelo) sugli elementi di una raccolta o di una matrice di origine. Nelle operazioni parallele sui dati, la raccolta di origine viene partizionata in modo che più thread possano operare contemporaneamente su segmenti diversi.

Task Parallel Library (TPL) supporta il parallelismo dei dati tramite la System.Threading.Tasks.Parallel classe . Questa classe fornisce implementazioni parallele basate sui metodi di ciclo for e ciclo foreach (For e For Each in Visual Basic). Si scrive la logica per un ciclo Parallel.For o Parallel.ForEach in modo simile a come si scriverebbe un ciclo sequenziale. Non è necessario creare thread o elementi di lavoro in coda. Nei cicli di base non è necessario accettare blocchi. Il TPL gestisce tutto il lavoro a livello basso per te. Per informazioni approfondite 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: Understanding and Applying Parallel Patterns with the .NET Framework 4). Nell'esempio di codice seguente viene illustrato un ciclo semplice foreach e il relativo equivalente parallelo.

Annotazioni

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, il TPL partiziona l'origine dati in modo che il ciclo possa operare contemporaneamente su più parti. Dietro le quinte, l'Utilità di pianificazione partiziona l'attività in base alle risorse di sistema e al carico di lavoro. Quando possibile, l'utilità di pianificazione ridistribuisce il lavoro tra più thread e processori se il carico di lavoro diventa sbilanciato.

Annotazioni

È anche possibile specificare una funzione di partizionamento personalizzata o un programmatore personalizzato. Per ulteriori informazioni, vedere Partitioner personalizzati per PLINQ e TPL e Gestori di attività.

Entrambi i metodi Parallel.For e Parallel.ForEach hanno numerosi overload che consentono di arrestare o interrompere l'esecuzione del ciclo, monitorare lo stato del ciclo in altri thread, mantenere lo stato locale del thread, finalizzare gli oggetti thread-local, controllare il grado di concorrenza e così via. I tipi helper che abilitano questa funzionalità includono ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken, e CancellationTokenSource.

Per altre informazioni, vedere Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4 (Modelli per la programmazione parallela: Informazioni e applicazione di modelli paralleli con .NET Framework 4).

Il parallelismo dei dati con sintassi dichiarativa o simile a una query è supportato da PLINQ. Per altre informazioni, vedere PARALLEL LINQ (PLINQ).For more information, see Parallel LINQ (PLINQ).

Titolo Descrizione
Come scrivere un semplice ciclo Parallel.For Viene descritto come scrivere un For ciclo su qualsiasi matrice o raccolta di origine indicizzabile IEnumerable<T> .
Come scrivere un semplice ciclo Parallel.ForEach Descrive come implementare un ciclo ForEach su qualunque IEnumerable<T> raccolta sorgente.
Procedura: Arrestare o interrompere da un ciclo Parallel.For Questo 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-Local Viene descritto come scrivere un For ciclo in cui ogni thread gestisce una variabile privata che non è visibile ad altri thread e come sincronizzare i risultati di tutti i thread al termine del ciclo.
Procedura: Scrivere un ciclo Parallel.ForEach con variabili Partition-Local Viene descritto come scrivere un ForEach ciclo in cui ogni thread gestisce una variabile privata che non è visibile ad altri thread e come sincronizzare i risultati di tutti i thread al termine del ciclo.
Procedura: Annullare un ciclo Parallel.For o ForEach Viene descritto come annullare un ciclo parallelo tramite un oggetto System.Threading.CancellationToken
Procedura: Velocizzare i corpi a ciclo ridotto Descrive un modo per accelerare l'esecuzione quando il corpo del ciclo è molto piccolo.
Task Parallel Library (TPL) Offre una panoramica della Task Parallel Library.
programmazione parallela Introduce la programmazione parallela in .NET Framework.

Vedere anche