Zum Hauptinhalt springen

Paralell Klasse

Die Parallel-Klasse in C# ist eine statische Klasse, die es erleichtert, parallele Operationen auf Daten durchzuführen. Sie bietet verschiedene Methoden, die es ermöglichen, Daten parallel zu durchlaufen, zu filtern, zu sortieren, zu gruppieren, zu projizieren oder zu aggregieren. Parallelität kann durch Multithreading oder durch das Aufteilen von Daten auf mehrere Prozessoren erreicht werden. Die Parallel-Klasse automatisiert den Prozess des Aufteilens von Daten und die Synchronisation zwischen den Threads oder Prozessen, um die Arbeit zu beschleunigen.

Wichtigsten Methoden der Klasse Parallel

MethodeBeschreibung
InvokeFührt eine Menge von Aktionen parallel aus und wartet, bis alle abgeschlossen sind.
ForEachFührt eine Aktion für jedes Element einer Auflistung parallel aus.
ForFührt eine Aktion für einen angegebenen Zahlenbereich parallel aus.
ForEachAsyncFührt eine asynchrone Aktion für jedes Element einer Auflistung parallel aus und gibt ein Task-Objekt zurück.
ForAsyncFührt eine asynchrone Aktion für einen angegebenen Zahlenbereich parallel aus und gibt ein Task-Objekt zurück.
InvokeAsyncFührt eine Menge von asynchronen Aktionen parallel aus und gibt ein Task-Objekt zurück.
ForEachPartitionedFührt eine Aktion für jedes Element einer Auflistung parallel aus und verteilt die Elemente auf Partitionen.
ForPartitionedFührt eine Aktion für einen angegebenen Zahlenbereich parallel aus und verteilt die Elemente auf Partitionen.
ForEach<TSource, TLocal>Führt eine Aktion für jedes Element einer Auflistung parallel aus und aggregiert das Ergebnis.
For<TSource, TLocal>Führt eine Aktion für einen angegebenen Zahlenbereich parallel aus und aggregiert das Ergebnis.

Wichtige Methoden Beispiele

Beispiel für Parallel.Invoke():

Parallel.Invoke(
() => Console.WriteLine("Task 1"),
() => Console.WriteLine("Task 2"),
() => Console.WriteLine("Task 3")
);

Beispiel für Parallel.For():

Parallel.For(0, 10, i => {
Console.WriteLine($"Current iteration: {i}");
});

Beispiel für Parallel.ForEach():

var items = new List<string>() { "Apple", "Banana", "Cherry", "Date" };
Parallel.ForEach(items, item => {
Console.WriteLine(item);
});

Vergleich parallele Schleife mit synchroner Schleife

Es ist nicht immer sinnvoll eine synchrone Schleife zu verwenden, dafür eine gewissen overhead entsteht. Siehe dazu folgendes Beispiel.

static void Main(string[] args)
{
int[] values = { 10000, 100000, 500000, 1000000, 10000000 };
for (int index = 0; index < 5; index++)
{
Console.WriteLine($"Iteration: {index + 1}\n{new string('-', 30)}");

int loops = values[index];
double[] arr = new double[loops];

// Synchronous loop
var watch = Stopwatch.StartNew();
for (int i = 0; i < loops; i++)
{
arr[i] = Math.Pow(i, 0.333) * Math.Sqrt(Math.Sin(i));
}
watch.Stop();
Console.WriteLine($"Synchronous: {watch.ElapsedMilliseconds}ms");

// Parallel loop
watch.Restart();
Parallel.For(0, loops, i =>
{
arr[i] = Math.Pow(i, 0.333) * Math.Sqrt(Math.Sin(i));
});
watch.Stop();
Console.WriteLine($"Parallel: {watch.ElapsedMilliseconds}ms\n");
}
Console.ReadLine();
}

Parallele Vs Synchrone Schleife

Anzahl Kerne

In der Parallel.For Methode wird standardmäßig die maximale Anzahl von Kernen verwendet, die dem System zur Verfügung stehen. Wenn die Anzahl der Kerne einschränkt werden soll, kann die ParallelOptions Klasse verwenden und die MaxDegreeOfParallelism Eigenschaft festlegen.

ParallelOptions options = new ParallelOptions { MaxDegreeOfParallelism = 4 };
Parallel.For(0, 100, options, i =>
{
Console.WriteLine(i);
});

Kommentare