C# Academy · Lektion

Parallel.ForEach och PLINQ

Kör arbete parallellt med Parallel.ForEach och bygg parallella pipelines med PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered).

Lektion 1 av 38 steg

Parallel.ForEach och PLINQ är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 1 av 3. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 3 lektioner.

Varför parallella loopar

Mål: Utnyttja CPU:n bättre.

  • Parallel.ForEach: åtgärd per element
  • PLINQ: parallell fråga med operatorer
  • Styr graden av parallellism
  • Var försiktig med sidoeffekter

Grunderna i Parallel.ForEach

Parallel.ForEach fördelar iterationerna över trådar; varje iteration kör den angivna åtgärden.

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

Styr parallellism

Använd ParallelOptions.MaxDegreeOfParallelism för att begränsa samtidigheten när resurserna är knappa.

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

PLINQ-pipeline

PLINQ kör LINQ-operatorer parallellt. ForAll förbrukar resultaten samtidigt, utan ordning.

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

Ordningstyrning

Använd AsOrdered för att bevara ordningen; AsSequential växlar tillbaka till entrådad LINQ när det behövs.

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

Säkerhet och tips

Tips:

  • Undvik delat föränderligt tillstånd; föredra rena funktioner.
  • Använd trådsäkra samlingar om ni måste skriva till dem.
  • Använd större batcher i stället för små arbetsobjekt.
  • Mät: parallellism hjälper CPU-bundet arbete, inte väntan på I/O.

Parallel.ForEach kontra PLINQ

Snabb kontroll: Vad är en viktig skillnad mellan Parallel.ForEach och PLINQ?

Sammanfattning

Sammanfattning: Använd Parallel.ForEach för åtgärder per element och PLINQ för att skapa parallella frågor, styra samtidigheten och vid behov bevara ordningen.

Gratis att börja

Lär dig C# med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
93
Lektioner
346

Vanliga frågor

Är lektionen ”Parallel.ForEach och PLINQ” gratis?

Ja – hela texten till ”Parallel.ForEach och PLINQ” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 3 lektioner.

Vad lär jag mig i ”Parallel.ForEach och PLINQ”?

Kör arbete parallellt med Parallel.ForEach och bygg parallella pipelines med PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered). Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C# Academy?

Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 3.

Hur lång tid tar lektionen ”Parallel.ForEach och PLINQ”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C# Academy-lektionen?

Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Parallel.ForEach och PLINQ
  2. Producent/konsument med Channels (översikt)
  3. Avvägningar mellan throughput och latency
← Tillbaka till C# Academy