0Pricing
C# Academy · Aula

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

Verificação rápida: Qual é uma diferença fundamental entre Parallel.ForEach e 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

  1. Parallel.ForEach, PLINQ
  2. Produtor/consumidor com Channels (visão geral)
  3. Compromissos entre vazão e latência
← Voltar para C# Academy