LeituraDiferentes formas de trabalhar com paralelismo no C#: threads, Parallel For e Parallel LINQ
Criado em 27/12/2022
O paralelismo é uma técnica que permite que você divida uma tarefa em várias partes e execute essas partes ao mesmo tempo, aproveitando ao máximo o poder de processamento do seu computador. Isso pode ser útil quando você precisa realizar uma tarefa que leva muito tempo, como processar uma grande quantidade de dados ou executar uma simulação complexa.
No C#, existem várias formas de se trabalhar com paralelismo, dependendo da sua necessidade. Algumas dessas formas são:
Threads
As threads são um recurso do sistema operacional que permitem que você execute uma tarefa em paralelo com outras tarefas. No C#, você pode criar threads usando a classe Thread
ou a classe Task
. Por exemplo:
using System.Threading;
Thread thread = new Thread(() => {
// Aqui vai o código da thread
});
thread.Start();
// Ou
Task.Run(() => {
// Aqui vai o código da task
});
Parallel For:
O Parallel For é uma estrutura de loop que permite que você execute um loop de forma paralela ou seja, em múltiplas threads ao mesmo tempo. Você pode usar o Parallel For usando o método Parallel.For
ou a classe ParallelLoopResult
. Isso pode ser útil quando você precisa realizar uma tarefa em uma grande quantidade de elementos e quer aproveitar ao máximo o poder de processamento do seu computador. Por exemplo:
Para usar o
Parallel ForEach, basta chamar o método
Parallel.ForEach
e passar como parâmetros uma coleção de elementos e uma ação a ser executada em cada elemento. Por exemplo:
List numbers = new List { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Parallel.ForEach(numbers, (number) => {
Console.WriteLine($"Processing number {number}");
});
Esse código irá imprimir a mensagem "Processing number X" para cada número da lista, mas a ordem em que as mensagens são impressas pode ser diferente da ordem original da lista, pois cada iteração do loop é executada em uma thread diferente.
Além disso, o Parallel ForEach também permite que você especifique opções de execução, como o número máximo de threads a serem utilizadas ou o modo de paralelismo a ser utilizado. Por exemplo:
ParallelOptions options = new ParallelOptions { MaxDegreeOfParallelism = 4 };
Parallel.ForEach(numbers, options, (number) => {
Console.WriteLine($"Processing number {number}");
});
Nesse exemplo, o Parallel ForEach irá utilizar no máximo 4 threads para executar o loop, o que pode ser útil em casos em que você não quer sobrecarregar o sistema com muitas threads.
Em resumo, o Parallel ForEach é uma ferramenta muito útil para acelerar o processamento de tarefas em grandes coleções de dados, mas é importante levar em consideração que o uso excessivo de threads pode sobrecarregar o sistema e até mesmo diminuir o desempenho em alguns casos. Por isso, é sempre importante medir o impacto do uso doParallel ForEach em seu código e, se necessário, ajustar as opções de execução para obter o melhor resultado possível.
Parallel LINQ (PLINQ)
O Parallel LINQ é um conjunto de operadores que permite que você execute consultas LINQ de forma paralela. Você pode usar o Parallel LINQ usando o métodoAsParallel
e os operadores WithDegreeOfParallelism
eWithExecutionMode
. Por exemplo:
using System.Linq;
var result = from n in Enumerable.Range(0, 10)
.AsParallel()
.WithDegreeOfParallelism(2)
.WithExecutionMode
(ParallelExecutionMode.ForceParallelism) select n;
Em resumo, o paralelismo é uma técnica poderosa para acelerar o processamento de tarefas que levam muito tempo, mas é importante levar em consideração que o uso excessivo de threads pode sobrecarregar o sistema e até mesmo diminuir o desempenho em alguns casos, por isso avalie bem o cenário e utilize as ferramentas de diagnóstico da própria IDE para identificar as métricas e verificar se a alteração está sendo eficiente ou não, em breve vou escrever um artigo sobre essas ferramentas, até breve! :)