Parallel.ForEach, PLINQ
Execute trabalho em paralelo com Parallel.ForEach e crie esteiras paralelas com PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered).
Parallel.ForEach, PLINQ é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 1 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 3 aulas no total.
Por que usar laços paralelos
Objetivo: Usar melhor a CPU.
- Parallel.ForEach: uma ação por item
- PLINQ: consulta paralela com operadores
- Controle o grau de paralelismo
- Tenha cuidado com efeitos colaterais
Noções básicas de Parallel.ForEach
Parallel.ForEach distribui as iterações entre threads; cada item executa a ação fornecida.
using System;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
// Runs iterations concurrently on thread pool
Parallel.ForEach(data, x =>
{
int y = x * x; // small CPU work
Console.WriteLine("x=" + x + " y=" + y + " on " + Environment.CurrentManagedThreadId);
});
}
}
Controle do paralelismo
Use ParallelOptions.MaxDegreeOfParallelism para limitar a concorrência quando os recursos forem escassos.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
ParallelOptions opt = new ParallelOptions();
opt.MaxDegreeOfParallelism = 2; // limit concurrency
Parallel.ForEach(data, opt, x =>
{
Console.WriteLine("Start " + x);
Thread.Sleep(150); // simulate work
Console.WriteLine("Done " + x);
});
}
}
Fluxo do PLINQ
PLINQ executa operadores do LINQ em paralelo. ForAll consome os resultados simultaneamente, sem preservar a ordem.
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] nums = Enumerable.Range(1, 20).ToArray();
// Filter then project in parallel
var query =
nums
.AsParallel()
.WithDegreeOfParallelism(2)
.Where(n => n % 2 == 0)
.Select(n => n * n);
// ForAll consumes in parallel; order not guaranteed
query.ForAll(sq => Console.WriteLine(sq));
}
}
Controles de ordenação
Use AsOrdered para preservar a ordem; AsSequential volta ao LINQ de thread única quando necessário.
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] nums = new int[] { 5, 4, 3, 2, 1 };
// Preserve original sequence order for the output
var ordered =
nums.AsParallel().AsOrdered().Select(n => n * 10).ToArray();
// Switch back to sequential for a section if needed
var seq =
nums.AsParallel().Select(n => n + 1).AsSequential().Where(n => n > 3).ToArray();
Console.WriteLine("Ordered: " + string.Join(",", ordered));
Console.WriteLine("Sequential tail: " + string.Join(",", seq));
}
}
Segurança e dicas
Dicas:
- Evite estado mutável compartilhado; prefira funções puras.
- Use coleções seguras para acesso concorrente se precisar escrever nelas.
- Prefira lotes maiores a itens de trabalho muito pequenos.
- Meça: o paralelismo ajuda em trabalhos limitados pela CPU, não em esperas de E/S.
Parallel.ForEach versus PLINQ
Resumo
Resumo: Use Parallel.ForEach para ações por item; use PLINQ para criar consultas paralelas, controlar a concorrência e, opcionalmente, preservar a ordem.
Perguntas Frequentes
A aula “Parallel.ForEach, PLINQ” é grátis?
Sim — o texto completo de “Parallel.ForEach, PLINQ” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 3 aulas no total.
O que vou aprender em “Parallel.ForEach, PLINQ”?
Execute trabalho em paralelo com Parallel.ForEach e crie esteiras paralelas com PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered). Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 3.
Quanto tempo leva a aula “Parallel.ForEach, PLINQ”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Parallel.ForEach, PLINQ
- Produtor/consumidor com Channels (visão geral)
- Compromissos entre vazão e latência