Parallel.ForEach, PLINQ
Führen Sie Arbeiten mit Parallel.ForEach parallel aus und erstellen Sie parallele Pipelines mit PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered).
Parallel.ForEach, PLINQ ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.
Warum parallele Schleifen
Ziel: Nutzen Sie die CPU besser aus.
- Parallel.ForEach: Aktion pro Element
- PLINQ: parallele Abfrage mit Operatoren
- Steuern Sie den Grad der Parallelität
- Gehen Sie vorsichtig mit Seiteneffekten um
Grundlagen von Parallel.ForEach
Parallel.ForEach verteilt Iterationen auf Threads; für jedes Element wird die angegebene Aktion ausgeführt.
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);
});
}
}
Parallelität steuern
Verwenden Sie ParallelOptions.MaxDegreeOfParallelism, um die Parallelität zu begrenzen, wenn Ressourcen knapp sind.
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 führt LINQ-Operatoren parallel aus. ForAll verarbeitet Ergebnisse gleichzeitig (ohne festgelegte Reihenfolge).
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));
}
}
Steuerung der Reihenfolge
Verwenden Sie AsOrdered, um die Reihenfolge beizubehalten; AsSequential wechselt bei Bedarf zurück zu LINQ mit nur einem Thread.
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));
}
}
Sicherheit und Tipps
Tipps:
- Vermeiden Sie gemeinsam veränderlichen Zustand; bevorzugen Sie reine Funktionen.
- Verwenden Sie threadsichere Sammlungen, wenn Sie schreiben müssen.
- Verarbeiten Sie größere Batches statt vieler kleiner Arbeitselemente.
- Messen Sie: Parallelität hilft bei CPU-gebundener Arbeit, nicht beim Warten auf I/O.
Parallel.ForEach im Vergleich zu PLINQ
Zusammenfassung
Zusammenfassung: Verwenden Sie Parallel.ForEach für Aktionen pro Element und PLINQ zum Erstellen paralleler Abfragen, zum Steuern der Parallelität und optional zum Beibehalten der Reihenfolge.
Häufig gestellte Fragen
Ist die Lektion „Parallel.ForEach, PLINQ“ kostenlos?
Ja — der vollständige Text von „Parallel.ForEach, PLINQ“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.
Was lerne ich in „Parallel.ForEach, PLINQ“?
Führen Sie Arbeiten mit Parallel.ForEach parallel aus und erstellen Sie parallele Pipelines mit PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered). Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 3.
Wie lange dauert die Lektion „Parallel.ForEach, PLINQ“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Parallel.ForEach, PLINQ
- Producer/Consumer mit Channels (Überblick)
- Abwägung zwischen Durchsatz und Latenz