Datenparallelität (Task Parallel Library)Data Parallelism (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.Data parallelism refers to scenarios in which the same operation is performed concurrently (that is, in parallel) on elements in a source collection or array. In parallelen Datenvorgängen wird die Quellauflistung partitioniert, sodass mehrere Threads gleichzeitig auf verschiedene Segmente angewendet werden können.In data parallel operations, the source collection is partitioned so that multiple threads can operate on different segments concurrently.

Die Task Parallel Library (TPL) unterstützt Datenparallelität durch die System.Threading.Tasks.Parallel-Klasse.The Task Parallel Library (TPL) supports data parallelism through the System.Threading.Tasks.Parallel class. Diese Klasse stellt methodenbasierte parallele Implementierungen von for-Schleifen und foreach-Schleifen bereit (For und For Each in Visual Basic).This class provides method-based parallel implementations of for and foreach loops (For and 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.You write the loop logic for a Parallel.For or Parallel.ForEach loop much as you would write a sequential loop. Sie müssen keine Threads erstellen oder Arbeitselemente in die Warteschlange einreihen.You do not have to create threads or queue work items. In grundlegenden Schleifen sind keine Sperren erforderlich.In basic loops, you do not have to take locks. Die TPL übernimmt alle Arbeiten auf niedriger Ebene für Sie.The TPL handles all the low-level work for you. 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.For in-depth information about the use of Parallel.For and Parallel.ForEach, download the document Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4. Im folgenden Codebeispiel werden eine einfache foreach-Schleife und deren parallele Entsprechung dargestellt.The following code example shows a simple foreach loop and its parallel equivalent.

Hinweis

Diese Dokumentation definiert Delegaten in TPL mithilfe von Lambdaausdrücken.This documentation uses lambda expressions to define delegates in TPL. 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).If you are not familiar with lambda expressions in C# or Visual Basic, see Lambda Expressions in PLINQ and 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.When a parallel loop runs, the TPL partitions the data source so that the loop can operate on multiple parts concurrently. Im Hintergrund partitioniert der Taskplaner die Aufgabe basierend auf den Systemressourcen und der Arbeitsauslastung.Behind the scenes, the Task Scheduler partitions the task based on system resources and workload. Nach Möglichkeit verteilt der Planer die Arbeit auf mehrere Threads und Prozessoren, wenn die Arbeitsauslastung unausgewogen ist.When possible, the scheduler redistributes work among multiple threads and processors if the workload becomes unbalanced.

Hinweis

Sie können auch einen eigenen, benutzerdefinierten Partitionierer oder Planer angeben.You can also supply your own custom partitioner or scheduler. Weitere Informationen finden Sie unter Custom Partitioners for PLINQ and TPL (Benutzerdefinierte Partitionierer für PLINQ und TPL) sowie unter TaskScheduler.For more information, see Custom Partitioners for PLINQ and TPL and Task Schedulers.

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.Both the Parallel.For and Parallel.ForEach methods have several overloads that let you stop or break loop execution, monitor the state of the loop on other threads, maintain thread-local state, finalize thread-local objects, control the degree of concurrency, and so on. Zu den Hilfstypen, die diese Funktionalität ermöglichen, zählen ParallelLoopState, ParallelOptions und ParallelLoopResult, CancellationToken und CancellationTokenSource.The helper types that enable this functionality include ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken, and CancellationTokenSource.

Weitere Informationen finden Sie im Thema über Muster für parallele Programmierung: Verstehen und Anwenden paralleler Muster mit .NET Framework 4 herunter.For more information, see Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4.

Datenparallelismus mit deklarativer oder abfrageähnlicher Syntax wird von PLINQ unterstützt.Data parallelism with declarative, or query-like, syntax is supported by PLINQ. Weitere Informationen finden Sie unter Parallel LINQ (PLINQ) Paralleles LINQ (PLINQ).For more information, see Parallel LINQ (PLINQ).

TitelTitle BESCHREIBUNGDescription
Vorgehensweise: Schreiben einer einfachen Parallel.For-SchleifeHow to: Write a Simple Parallel.For Loop Beschreibt, wie eine For-Schleife über jedes Array oder indizierbare IEnumerable<T>-Quellauflistung geschrieben wird.Describes how to write a For loop over any array or indexable IEnumerable<T> source collection.
Vorgehensweise: Schreiben einer einfachen Parallel.ForEach-SchleifeHow to: Write a Simple Parallel.ForEach Loop Beschreibt, wie eine ForEach-Schleife über jede IEnumerable<T>-Quellauflistung geschrieben wird.Describes how to write a ForEach loop over any IEnumerable<T> source collection.
Vorgehensweise: Stopp oder Pause durch eine Parallel.For-SchleifeHow to: Stop or Break from a Parallel.For Loop Beschreibt, wie eine parallele Schleife beendet oder unterbrochen wird, damit alle Threads von der Aktion informiert werden.Describes how to stop or break from a parallel loop so that all threads are informed of the action.
Vorgehensweise: Schreiben einer Parallel.For-Schleife mit threadlokalen VariablenHow to: Write a Parallel.For Loop with Thread-Local Variables 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.Describes how to write a For loop in which each thread maintains a private variable that is not visible to any other threads, and how to synchronize the results from all threads when the loop completes.
Vorgehensweise: Schreiben einer Parallel.ForEach-Schleife mit partitionslokalen VariablenHow to: Write a Parallel.ForEach Loop with Partition-Local Variables 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.Describes how to write a ForEach loop in which each thread maintains a private variable that is not visible to any other threads, and how to synchronize the results from all threads when the loop completes.
Vorgehensweise: Abbrechen einer Parallel.For-Schleife oder einer ForEach-SchleifeHow to: Cancel a Parallel.For or ForEach Loop Beschreibt, wie eine parallele Schleife mit einem System.Threading.CancellationToken-Objekt abgebrochen wirdDescribes how to cancel a parallel loop by using a System.Threading.CancellationToken
Vorgehensweise: Beschleunigen von kurzen SchleifenkörpernHow to: Speed Up Small Loop Bodies Beschreibt eine Möglichkeit zur Beschleunigung der Ausführung, wenn ein Schleifenkörper sehr klein ist.Describes one way to speed up execution when a loop body is very small.
Task Parallel Library (TPL)Task Parallel Library (TPL) Übersicht über die Task Parallel Library.Provides an overview of the Task Parallel Library.
Parallele ProgrammierungParallel Programming Einführung in parallele Programmierung in .NET FrameworkIntroduces Parallel Programming in the .NET Framework.

Siehe auchSee also