Datenparallelität (Task Parallel Library)
Datenparallelismus verweist auf Szenarios, in denen der gleiche Vorgang gleichzeitig (d.h. parallel) für Elemente in einer Quellauflistung oder einem Array ausgeführt wird. In parallelen Datenvorgängen wird die Quellauflistung partitioniert, sodass mehrere Threads gleichzeitig auf verschiedene Segmente angewendet werden können.
Die Task Parallel Library (TPL) unterstützt Datenparallelität durch die System.Threading.Tasks.Parallel-Klasse. Diese Klasse stellt methodenbasierte parallele Implementierungen von for-Schleifen und foreach-Schleifen bereit (For
und For Each
in Visual Basic). Sie schreiben die Schleifenlogik für eine Parallel.For-Schleife oder Parallel.ForEach-Schleife weitgehend auf die gleiche Weise wie eine sequenzielle Schleife. Sie müssen keine Threads erstellen oder Arbeitselemente in die Warteschlange einreihen. In grundlegenden Schleifen sind keine Sperren erforderlich. Die TPL übernimmt alle Arbeiten auf niedriger Ebene für Sie. Um ausführliche Informationen über die Verwendung von Parallel.For und Parallel.ForEach zu erhalten, laden Sie das Dokument zum Thema Muster für parallele Programmierung: Verstehen und Anwenden paralleler Muster mit .NET Framework 4 herunter. Im folgenden Codebeispiel werden eine einfache foreach
-Schleife und deren parallele Entsprechung dargestellt.
Hinweis
Diese Dokumentation definiert Delegaten in TPL mithilfe von Lambdaausdrücken. Falls Sie mit der Verwendung von Lambda-Ausdrücken in C# oder Visual Basic nicht vertraut sind, finden Sie entsprechende Informationen unter Lambda Expressions in PLINQ and TPL (Lambda-Ausdrücke in PLINQ und TPL).
// Sequential version
foreach (var item in sourceCollection)
{
Process(item);
}
// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
' Sequential version
For Each item In sourceCollection
Process(item)
Next
' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
Wenn eine parallele Schleife ausgeführt wird, partitioniert die TPL die Datenquelle, sodass die Schleife mehrere Teile gleichzeitig bearbeiten kann. Im Hintergrund partitioniert der Taskplaner die Aufgabe basierend auf den Systemressourcen und der Arbeitsauslastung. Nach Möglichkeit verteilt der Planer die Arbeit auf mehrere Threads und Prozessoren, wenn die Arbeitsauslastung unausgewogen ist.
Hinweis
Sie können auch einen eigenen, benutzerdefinierten Partitionierer oder Planer angeben. Weitere Informationen finden Sie unter Custom Partitioners for PLINQ and TPL (Benutzerdefinierte Partitionierer für PLINQ und TPL) sowie unter TaskScheduler.
Sowohl die Parallel.For-Methode als auch die Parallel.ForEach-Methode verfügen über mehrere Überladungen, die es Ihnen ermöglichen, die Schleifenausführung anzuhalten bzw. zu unterbrechen, den Zustand der Schleife in anderen Threads zu überwachen, den lokalen Threadzustand beizubehalten, lokale Threadobjekte abzuschließen, den Grad der Parallelität zu steuern usw. Zu den Hilfstypen, die diese Funktionalität ermöglichen, zählen ParallelLoopState, ParallelOptions und ParallelLoopResult, CancellationToken und CancellationTokenSource.
Weitere Informationen finden Sie im Thema über Muster für parallele Programmierung: Verstehen und Anwenden paralleler Muster mit .NET Framework 4 herunter.
Datenparallelismus mit deklarativer oder abfrageähnlicher Syntax wird von PLINQ unterstützt. Weitere Informationen finden Sie unter Parallel LINQ (PLINQ) Paralleles LINQ (PLINQ).
Verwandte Themen
Titel | Beschreibung |
---|---|
Vorgehensweise: Schreiben einer einfachen Parallel.For-Schleife | Beschreibt, wie eine For-Schleife über jedes Array oder indizierbare IEnumerable<T>-Quellauflistung geschrieben wird. |
Vorgehensweise: Schreiben einer einfachen Parallel.ForEach-Schleife | Beschreibt, wie eine ForEach-Schleife über jede IEnumerable<T>-Quellauflistung geschrieben wird. |
Vorgehensweise: Anhalten oder Pausieren durch eine Parallel.For-Schleife | Beschreibt, wie eine parallele Schleife beendet oder unterbrochen wird, damit alle Threads von der Aktion informiert werden. |
Vorgehensweise: Schreiben einer Parallel.For-Schleife mit threadlokalen Variablen | Beschreibt, wie eine For-Schleife geschrieben wird, in der jeder Thread eine private Variable beibehält, die für alle anderen Threads nicht sichtbar ist, und wie die Ergebnisse von allen Threads synchronisiert werden, wenn die Schleife abgeschlossen wird. |
Vorgehensweise: Schreiben einer Parallel.ForEach-Schleife mit partitionslokalen Variablen | Beschreibt, wie eine ForEach-Schleife geschrieben wird, in der jeder Thread eine private Variable beibehält, die für alle anderen Threads nicht sichtbar ist, und wie die Ergebnisse von allen Threads synchronisiert werden, wenn die Schleife abgeschlossen wird. |
Vorgehensweise: Abbrechen einer Parallel.For-Schleife oder einer ForEach-Schleife | Beschreibt, wie eine parallele Schleife mit einem System.Threading.CancellationToken-Objekt abgebrochen wird |
Vorgehensweise: Beschleunigen von kurzen Schleifenkörpern | Beschreibt eine Möglichkeit zur Beschleunigung der Ausführung, wenn ein Schleifenkörper sehr klein ist. |
Task Parallel Library (TPL) | Übersicht über die Task Parallel Library. |
Parallele Programmierung | Einführung in parallele Programmierung in .NET Framework |