Paralelismo de dados (biblioteca de tarefas paralelas)

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. Nas operações paralelas de dados, a coleção de origem é particionada de modo que múltiplos threads possam operar em segmentos diferentes simultaneamente.

A biblioteca de paralelismo de tarefas (TPL) suporta paralelismo de dados por meio da classe System.Threading.Tasks.Parallel. Essa classe fornece implementações paralelas baseadas em métodos dos loops for e foreach (For e For Each no Visual Basic). Você grava a lógica do loop para um loop Parallel.For ou Parallel.ForEach tanto quanto você gravaria um loop sequencial. Você não precisa criar threads ou listar itens de trabalho. Nos loops básicos, você não precisa usar bloqueios. A TPL manipula todo o trabalho de nível baixo para você. 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. O exemplo de código a seguir mostra um loop foreach simples e seu equivalente paralelo.

Observação

Esta documentação usa expressões lambda para definir delegados na TLP. Se você não estiver familiarizado com expressões lambda no C# ou no Visual Basic, veja Expressões lambda em 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 um loop paralelo é executado, o TPL particiona a fonte de dados para que o loop possa operar em várias partes simultaneamente. Nos bastidores, o Agendador de Tarefas particiona a tarefa com base na carga de trabalho e recursos do sistema. Quando possível, o agendador redistribui o trabalho entre vários threads e processadores se a carga de trabalho ficar desequilibrada.

Observação

Você também pode fornecer seu próprio particionador ou agendador personalizado. Para obter mais informações, confira Particionadores personalizados para PLINQ e TPL e Agendadores de tarefas.

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. Os tipos auxiliares que permitem essa funcionalidade incluem ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken, e 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.

O paralelismo de dados com a sintaxe declarativa ou similar a uma consulta é suportado pelo PLINQ. Para obter mais informações, consulte PLINQ (Parallel LINQ).

Título Descrição
Como: Escrever um loop Parallel.For simples Descreve como gravar um loop For sobre qualquer matriz ou coleção de origem IEnumerable<T> indexável.
Como: escrever um loop Parallel.ForEach simples Descreve como gravar um loop ForEach sobre qualquer coleção de origem IEnumerable<T>.
Como parar ou interromper um loop Parallel.For Descreve como parar ou interromper um loop paralelo para que todos os threads sejam informados da ação.
Como: Gravar um loop Parallel.For com variáveis locais de thread 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.
Como: escrever um loop Parallel.ForEach com variáveis locais de partição 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.
Como: Cancelar um loop Parallel.For ou ForEach Descreve como cancelar um loop paralelo usando um System.Threading.CancellationToken
Como: Acelerar corpos de loop pequenos Descreve uma maneira de acelerar a execução quando um corpo de loop é muito pequeno.
Biblioteca de tarefas paralelas (TPL) Fornece uma visão geral da biblioteca de paralelismo de tarefas.
Programação paralela Apresenta a Programação paralela no .NET Framework.

Confira também