Datenparallelität (Task Parallel Library)
Datenparallelismus verweist auf Szenarien, in denen der gleiche Vorgang gleichzeitig (d. h. parallel) für Elemente in einer Quellauflistung oder einem Array ausgeführt wird. Datenparallelismus mit imperativer Syntax wird von mehreren Überladungen von der For-Methode und der ForEach-Methode in der System.Threading.Tasks.Parallel-Klasse unterstützt. In parallelen Datenvorgängen wird die Quellauflistung partitioniert, sodass mehrere Threads gleichzeitig auf verschiedene Segmente angewendet werden können. 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 Arbeitsaufgaben in die Warteschlange einreihen. In grundlegenden Schleifen sind keine Sperren erforderlich. Die TPL übernimmt alle Arbeiten auf niedriger Ebene für Sie. Im folgenden Codebeispiel werden eine einfache foreach-Schleife und deren parallele Entsprechung dargestellt.
Hinweis |
---|
Diese Dokumentation definiert Delegaten in TPL mithilfe von Lambda-Ausdrücken.Wenn Sie in C# oder Visual Basic nicht mit Lambda-Ausdrücken vertraut sind, finden Sie unter Lambda-Ausdrücke in PLINQ und TPL entsprechende Informationen. |
' Sequential version
For Each item In sourceCollection
Process(item)
Next
' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
// Sequential version
foreach (var item in sourceCollection)
{
Process(item);
}
// Parallel equivalent
Parallel.ForEach(sourceCollection, 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 Benutzerdefinierte Partitionierer für PLINQ und TPL und Taskplaner. |
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 unter Datenparallelität (Task Parallel Library).
Datenparallelismus mit deklarativer oder abfrageähnlicher Syntax wird von PLINQ unterstützt. Weitere Informationen finden Sie unter Paralleles LINQ (PLINQ).
Verwandte Themen
Titel |
Beschreibung |
---|---|
Gewusst wie: Schreiben einer einfachen Parallel.For-Schleife |
Beschreibt, wie eine For-Schleife über jedes Array oder indizierbare IEnumerable<T>-Quellauflistung geschrieben wird. |
Gewusst wie: Schreiben einer einfachen Parallel.ForEach-Schleife |
Beschreibt, wie eine ForEach-Schleife über jede IEnumerable<T>-Quellauflistung geschrieben wird. |
Gewusst wie: Beenden oder Verlassen einer Parallel.For-Schleife |
Beschreibt, wie eine parallele Schleife beendet oder unterbrochen wird, damit alle Threads von der Aktion informiert werden. |
Gewusst wie: Schreiben einer Parallel.For-Schleife mit lokalen Threadvariablen |
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. |
Gewusst wie: Schreiben einer Parallel.ForEach-Schleife mit lokalen Threadvariablen |
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. |
Gewusst wie: Abbrechen einer Parallel.For-Schleife oder einer ForEach-Schleife |
Beschreibt, wie eine parallele Schleife mit einem System.Threading.CancellationToken-Objekt abgebrochen wird |
Beschreibt eine Möglichkeit zur Beschleunigung der Ausführung, wenn ein Schleifenkörper sehr klein ist. |
|
Übersicht über die Task Parallel Library. |
|
Einführung in parallele Programmierung in .NET Framework |