C# Academy · Lektion

Parallel.ForEach og PLINQ

Kør arbejde parallelt med Parallel.ForEach, og byg parallelle pipelines med PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered).

Lektion 1 af 38 trin

Parallel.ForEach og PLINQ er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 1 af 3. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 3 lektioner i alt.

Hvorfor parallelle løkker

Mål: Udnyt CPU'en bedre.

  • Parallel.ForEach: handling pr. element
  • PLINQ: parallel forespørgsel med operatorer
  • Kontrollér graden af parallelisme
  • Vær forsigtig med bivirkninger

Grundlæggende om Parallel.ForEach

Parallel.ForEach fordeler iterationerne på tråde; hvert element kører den angivne handling.

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

Kontrollér parallelisme

Brug ParallelOptions.MaxDegreeOfParallelism til at begrænse samtidigheden, når ressourcerne er knappe.

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-forløb

PLINQ kører LINQ-operatorer parallelt. ForAll behandler resultater samtidigt (uden ordnet rækkefølge).

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

Kontrol af rækkefølge

Brug AsOrdered til at bevare rækkefølgen; AsSequential skifter tilbage til LINQ med én tråd, når det er nødvendigt.

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

Sikkerhed og tip

Tip:

  • Undgå delt tilstand, der kan ændres; foretræk rene funktioner.
  • Brug trådsikre samlinger, hvis du er nødt til at skrive.
  • Udfør arbejdet i større portioner i stedet for som små arbejdselementer.
  • Mål: Parallelisme hjælper ved CPU-begrænset arbejde, ikke ved ventetid på I/O.

Parallel.ForEach kontra PLINQ

Hurtigt tjek: Hvad er en vigtig forskel mellem Parallel.ForEach og PLINQ?

Opsummering

Opsummering: Brug Parallel.ForEach til handlinger pr. element; brug PLINQ til at opbygge parallelle forespørgsler, kontrollere samtidighed og eventuelt bevare rækkefølgen.

Gratis at komme i gang

Lær C# med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
93
Lektioner
346

Ofte stillede spørgsmål

Er lektionen “Parallel.ForEach og PLINQ” gratis?

Ja — hele teksten til “Parallel.ForEach og PLINQ” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 3 lektioner i alt.

Hvad lærer jeg i “Parallel.ForEach og PLINQ”?

Kør arbejde parallelt med Parallel.ForEach, og byg parallelle pipelines med PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered). Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C# Academy?

Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 3.

Hvor lang tid tager lektionen “Parallel.ForEach og PLINQ”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C# Academy-lektion?

Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Parallel.ForEach og PLINQ
  2. Producer/consumer med Channels (oversigt)
  3. Afvejning mellem throughput og latenstid
← Tilbage til C# Academy