Paralelismo de dados (biblioteca de tarefas paralelas)Data Parallelism (Task Parallel Library)

Paralelismo de dados refere-se a cenários em que a mesma operação é realizada simultaneamente (ou seja, em paralelo) em elementos em uma matriz ou coleção de origem.Data parallelism refers to scenarios in which the same operation is performed concurrently (that is, in parallel) on elements in a source collection or array. Nas operações paralelas de dados, a coleção de origem é particionada de modo que múltiplos threads possam operar em segmentos diferentes simultaneamente.In data parallel operations, the source collection is partitioned so that multiple threads can operate on different segments concurrently.

A biblioteca de paralelismo de tarefas (TPL) suporta paralelismo de dados por meio da classe System.Threading.Tasks.Parallel.The Task Parallel Library (TPL) supports data parallelism through the System.Threading.Tasks.Parallel class. Essa classe fornece implementações paralelas baseadas em métodos dos loops for e foreach (For e For Each no Visual Basic).This class provides method-based parallel implementations of for and foreach loops (For and For Each in Visual Basic). Você grava a lógica do loop para um loop Parallel.For ou Parallel.ForEach tanto quanto você gravaria um loop sequencial.You write the loop logic for a Parallel.For or Parallel.ForEach loop much as you would write a sequential loop. Você não precisa criar threads ou listar itens de trabalho.You do not have to create threads or queue work items. Nos loops básicos, você não precisa usar bloqueios.In basic loops, you do not have to take locks. A TPL manipula todo o trabalho de nível baixo para você.The TPL handles all the low-level work for you. Para obter informações detalhadas sobre o uso do Parallel.For e do Parallel.ForEach, baixe o documento Padrões da programação paralela: Noções básicas e aplicação de padrões paralelos, com o .NET Framework 4.For in-depth information about the use of Parallel.For and Parallel.ForEach, download the document Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4. O exemplo de código a seguir mostra um loop foreach simples e seu equivalente paralelo.The following code example shows a simple foreach loop and its parallel equivalent.

Observação

Esta documentação usa expressões lambda para definir delegados na TLP.This documentation uses lambda expressions to define delegates in TPL. Se você não estiver familiarizado com expressões lambda em C# ou Visual Basic, consulte expressões lambda em PLINQ e TPL.If you are not familiar with lambda expressions in C# or Visual Basic, see Lambda Expressions in PLINQ and 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 um loop paralelo é executado, o TPL particiona a fonte de dados para que o loop possa operar em várias partes simultaneamente.When a parallel loop runs, the TPL partitions the data source so that the loop can operate on multiple parts concurrently. Nos bastidores, o Agendador de Tarefas particiona a tarefa com base na carga de trabalho e recursos do sistema.Behind the scenes, the Task Scheduler partitions the task based on system resources and workload. Quando possível, o agendador redistribui o trabalho entre vários threads e processadores se a carga de trabalho ficar desequilibrada.When possible, the scheduler redistributes work among multiple threads and processors if the workload becomes unbalanced.

Observação

Você também pode fornecer seu próprio particionador ou agendador personalizado.You can also supply your own custom partitioner or scheduler. Para obter mais informações, confira Particionadores personalizados para PLINQ e TPL e Agendadores de tarefas.For more information, see Custom Partitioners for PLINQ and TPL and Task Schedulers.

Ambos os métodos Parallel.For e Parallel.ForEach têm várias sobrecargas que permitem parar ou interromper a execução do loop, monitorar o estado do loop em outros threads, manter o estado local do thread, finalizar os objetos locais do thread, controlar o grau de simultaneidade, e assim por diante.Both the Parallel.For and Parallel.ForEach methods have several overloads that let you stop or break loop execution, monitor the state of the loop on other threads, maintain thread-local state, finalize thread-local objects, control the degree of concurrency, and so on. Os tipos auxiliares que permitem essa funcionalidade incluem ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken, e CancellationTokenSource.The helper types that enable this functionality include ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken, and CancellationTokenSource.

Para obter mais informações, consulte Padrões para programação paralela: noções básicas e aplicação de padrões paralelos com o .NET Framework 4.For more information, see Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4.

O paralelismo de dados com a sintaxe declarativa ou similar a uma consulta é suportado pelo PLINQ.Data parallelism with declarative, or query-like, syntax is supported by PLINQ. Para obter mais informações, consulte PLINQ (Parallel LINQ).For more information, see Parallel LINQ (PLINQ).

TítuloTitle DescriçãoDescription
Como: Escrever um loop Parallel.For simplesHow to: Write a Simple Parallel.For Loop Descreve como gravar um loop For sobre qualquer matriz ou coleção de origem IEnumerable<T> indexável.Describes how to write a For loop over any array or indexable IEnumerable<T> source collection.
Como: escrever um loop Parallel.ForEach simplesHow to: Write a Simple Parallel.ForEach Loop Descreve como gravar um loop ForEach sobre qualquer coleção de origem IEnumerable<T>.Describes how to write a ForEach loop over any IEnumerable<T> source collection.
Como parar ou interromper um loop Parallel.ForHow to: Stop or Break from a Parallel.For Loop Descreve como parar ou interromper um loop paralelo para que todos os threads sejam informados da ação.Describes how to stop or break from a parallel loop so that all threads are informed of the action.
Como: Gravar um loop Parallel.For com variáveis locais de threadHow to: Write a Parallel.For Loop with Thread-Local Variables Descreve como gravar um loop For em que cada thread mantém uma variável privada que não está visível para outros threads, e como sincronizar os resultados de todos os threads quando o loop for concluído.Describes how to write a For loop in which each thread maintains a private variable that is not visible to any other threads, and how to synchronize the results from all threads when the loop completes.
Como: escrever um loop Parallel.ForEach com variáveis locais de partiçãoHow to: Write a Parallel.ForEach Loop with Partition-Local Variables Descreve como gravar um loop ForEach em que cada thread mantém uma variável privada que não está visível para outros threads, e como sincronizar os resultados de todos os threads quando o loop for concluído.Describes how to write a ForEach loop in which each thread maintains a private variable that is not visible to any other threads, and how to synchronize the results from all threads when the loop completes.
Como: Cancelar um loop Parallel.For ou ForEachHow to: Cancel a Parallel.For or ForEach Loop Descreve como cancelar um loop paralelo usando um System.Threading.CancellationTokenDescribes how to cancel a parallel loop by using a System.Threading.CancellationToken
Como: Acelerar corpos de loop pequenosHow to: Speed Up Small Loop Bodies Descreve uma maneira de acelerar a execução quando um corpo de loop é muito pequeno.Describes one way to speed up execution when a loop body is very small.
Biblioteca de tarefas paralelas (TPL)Task Parallel Library (TPL) Fornece uma visão geral da biblioteca de paralelismo de tarefas.Provides an overview of the Task Parallel Library.
Programação paralelaParallel Programming Apresenta a Programação paralela no .NET Framework.Introduces Parallel Programming in the .NET Framework.

Confira tambémSee also