Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O paralelismo de dados refere-se a cenários em que a mesma operação é executada simultaneamente (ou seja, em paralelo) em elementos em uma coleção ou matriz de origem. Em operações paralelas de dados, a coleção de origem é particionada para que vários threads possam operar em diferentes segmentos simultaneamente.
A TPL (Task Parallel Library) suporta paralelismo de dados através da System.Threading.Tasks.Parallel classe. Essa classe fornece implementações paralelas baseadas em método de loops for e foreach (For
e For Each
no Visual Basic). Você escreve a lógica de loop para um Parallel.For ou Parallel.ForEach loop da mesma forma que escreveria um loop sequencial. Não precisa criar threads nem itens de trabalho em fila. Em ciclos básicos, não é necessário utilizar bloqueios. A TPL lida com todas as operações de baixo nível por si. Para obter informações detalhadas sobre o uso de Parallel.For e Parallel.ForEach, baixe o documento Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4. O exemplo de código a seguir mostra um loop simples foreach
e seu equivalente paralelo.
Observação
Esta documentação usa expressões lambda para definir delegados na TPL. Se não estiveres familiarizado com expressões lambda em C# ou Visual Basic, consulta 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 nos recursos do sistema e na carga de trabalho. 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, consulte 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 ciclo, monitorizar o estado do ciclo em outros encadeamentos, manter o estado local do encadeamento, concluir objetos locais do encadeamento, controlar o grau de simultaneidade, e assim por diante. Os tipos auxiliares que habilitam essa funcionalidade incluem ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationTokene CancellationTokenSource.
Para obter mais informações, consulte Padrões para programação paralela: compreendendo e aplicando padrões paralelos com o .NET Framework 4.
O paralelismo de dados com sintaxe declarativa ou semelhante a uma consulta é suportado pelo PLINQ. Para obter mais informações, consulte Parallel LINQ (PLINQ).
Tópicos relacionados
Título | Descrição |
---|---|
Como escrever um ciclo Parallel.For simples | Descreve como gravar um For loop sobre qualquer matriz ou coleção de fontes indexáveis IEnumerable<T>. |
Como escrever um loop simples Parallel.ForEach | Descreve como escrever um ForEach loop sobre qualquer IEnumerable<T> coleção de origem. |
Como: Parar ou interromper num loop Parallel.For | Descreve como parar ou quebrar de um loop paralelo para que todos os threads sejam informados da ação. |
Como: Escrever um loop Parallel.For com variáveis Thread-Local | Descreve como escrever um For loop no qual cada thread mantém uma variável privada que não é visível para nenhum outro thread e como sincronizar os resultados de todos os threads quando o loop é concluído. |
Instruções para escrever um loop Parallel.ForEach com variáveis Partition-Local | Descreve como escrever um ForEach loop no qual cada thread mantém uma variável privada que não é visível para nenhum outro thread e como sincronizar os resultados de todos os threads quando o loop é concluído. |
Como cancelar um ciclo 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 o corpo de um ciclo é muito pequeno. |
Biblioteca paralela de tarefas (TPL) | Fornece uma visão geral da Biblioteca Paralela de Tarefas. |
Programação paralela | Introduz a programação paralela no .NET Framework. |