Parallel.ForEach og PLINQ
Kør arbejde parallelt med Parallel.ForEach, og byg parallelle pipelines med PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered).
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
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.
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
- Parallel.ForEach og PLINQ
- Producer/consumer med Channels (oversigt)
- Afvejning mellem throughput og latenstid