0Pricing
C# Academy · Lezione

Parallel.ForEach, PLINQ

Eseguite il lavoro in parallelo con Parallel.ForEach e costruite pipeline parallele con PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered).

Parallel.ForEach, PLINQ è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 3 lezioni in totale.

Perché usare i cicli paralleli

Obiettivo: utilizzi meglio la CPU.

  • Parallel.ForEach: un'azione per elemento
  • PLINQ: query parallela con operatori
  • Controllare il grado di parallelismo
  • Prestare attenzione agli effetti collaterali

Nozioni di base su Parallel.ForEach

Parallel.ForEach distribuisce le iterazioni tra i thread; ogni elemento esegue l'azione indicata.

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);
    });
  }
}

Controllo del parallelismo

Usi ParallelOptions.MaxDegreeOfParallelism per limitare la concorrenza quando le risorse sono scarse.

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);
    });
  }
}

Pipeline PLINQ

PLINQ esegue gli operatori LINQ in parallelo. ForAll consuma i risultati in modo concorrente, senza mantenere l'ordine.

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));
  }
}

Controllo dell'ordinamento

Usi AsOrdered per preservare l'ordine; AsSequential torna a LINQ a thread singolo quando necessario.

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));
  }
}

Sicurezza e suggerimenti

Suggerimenti:

  • Eviti lo stato mutabile condiviso; preferisca le funzioni pure.
  • Usi raccolte thread-safe se deve effettuare scritture.
  • Elabori batch più grandi invece di unità di lavoro minuscole.
  • Misuri: il parallelismo aiuta il lavoro vincolato dalla CPU, non l'attesa dell'I/O.

Parallel.ForEach e PLINQ a confronto

Verifica rapida: qual è una differenza fondamentale tra Parallel.ForEach e PLINQ?

Riepilogo

Riepilogo: usi Parallel.ForEach per le azioni sui singoli elementi; usi PLINQ per creare query parallele, controllare la concorrenza e, facoltativamente, preservare l'ordine.

Domande Frequenti

La lezione «Parallel.ForEach, PLINQ» è gratuita?

Sì — il testo completo di «Parallel.ForEach, PLINQ» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 3 lezioni in totale.

Cosa imparerò in «Parallel.ForEach, PLINQ»?

Eseguite il lavoro in parallelo con Parallel.ForEach e costruite pipeline parallele con PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered). Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 3.

Quanto tempo richiede la lezione «Parallel.ForEach, PLINQ»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Parallel.ForEach, PLINQ
  2. Producer/consumer con Channels (panoramica)
  3. Compromessi tra throughput e latenza
← Torna a C# Academy