Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Gegevensparallellisme verwijst naar scenario's waarin dezelfde bewerking gelijktijdig wordt uitgevoerd (dat wil gezegd, parallel) op elementen in een bronverzameling of matrix. In parallelle gegevensbewerkingen wordt de bronverzameling gepartitioneerd, zodat meerdere threads gelijktijdig op verschillende segmenten kunnen worden uitgevoerd.
De Task Parallel Library (TPL) ondersteunt gegevensparallelisme via de System.Threading.Tasks.Parallel klasse. Deze klasse biedt methodegebaseerde parallelle implementaties van for en foreach-lussen (For
en For Each
in Visual Basic). U schrijft de luslogica voor een Parallel.For of Parallel.ForEach lus net zoals u een sequentiële lus zou schrijven. U hoeft geen threads of werkstukken in de wachtrij te plaatsen. In basislussen hoeft u geen vergrendelingen te nemen. De TPL verwerkt al het werk op laag niveau voor u. Voor uitgebreide informatie over het gebruik van Parallel.For en Parallel.ForEach, download het document Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4. In het volgende codevoorbeeld ziet u een eenvoudige foreach
lus en het bijbehorende parallelle equivalent.
Opmerking
In deze documentatie worden lambda-expressies gebruikt om gedelegeerden in TPL te definiëren. Zie Lambda-expressies in PLINQ en TPLals u niet bekend bent met lambda-expressies in C# of Visual Basic.
// 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))
Wanneer een parallelle lus wordt uitgevoerd, partitioneert de TPL de gegevensbron, zodat de lus gelijktijdig op meerdere onderdelen kan worden uitgevoerd. Achter de schermen partitioneert task scheduler de taak op basis van systeemresources en workload. Indien mogelijk herverdeelt de scheduler werk tussen meerdere threads en processors wanneer de workload uit balans raakt.
Opmerking
U kunt ook uw eigen aangepaste partitioner of planner opgeven. Zie Aangepaste partitioneerfuncties voor PLINQ en TPL enTaakplanners voor meer informatie.
Zowel de Parallel.For als de Parallel.ForEach methoden hebben verschillende overloads waarmee u de uitvoering van een lus kunt stoppen of onderbreken, de status van de lus op andere threads kunt bewaken, de status van thread-local kunt onderhouden, thread-lokale objecten kunt afronden, de mate van gelijktijdigheid kunt beheersen, enzovoort. De helpertypen die deze functionaliteit mogelijk maken, zijn onder andere ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationTokenen CancellationTokenSource.
Zie Patronen voor parallelle programmering: Inzicht in en toepassen van parallelle patronen met .NET Framework 4 voor meer informatie.
Gegevensparallelisme met declaratieve of query-achtige syntaxis wordt ondersteund door PLINQ. Zie Parallel LINQ (PLINQ) voor meer informatie.
Verwante onderwerpen
Titel | Beschrijving |
---|---|
Hoe te: Een eenvoudige Parallel.For-lus schrijven | Beschrijft hoe u een lus over een For matrix of indexeerbare IEnumerable<T> bronverzameling schrijft. |
Hoe schrijf je een eenvoudige Parallel.ForEach-lus | Beschrijft hoe u een lus over een ForEachIEnumerable<T> bronverzameling schrijft. |
Procedure: Stoppen of onderbreken van een Parallel.For-lus | Hier wordt beschreven hoe u een parallelle lus kunt stoppen of onderbreken, zodat alle threads op de hoogte worden gebracht van de actie. |
Instructies: een parallel.for-lus schrijven met Thread-Local variabelen | Beschrijft hoe u een For lus schrijft waarin elke thread een privévariabele onderhoudt die niet zichtbaar is voor andere threads en hoe u de resultaten van alle threads synchroniseert wanneer de lus is voltooid. |
Procedure: Een Parallel.ForEach-lus schrijven met Partition-Local Variabelen | Beschrijft hoe u een ForEach lus schrijft waarin elke thread een privévariabele onderhoudt die niet zichtbaar is voor andere threads en hoe u de resultaten van alle threads synchroniseert wanneer de lus is voltooid. |
Procedure: Een parallel.for- of ForEach-lus annuleren | Beschrijft hoe u een parallelle lus annuleert met behulp van een System.Threading.CancellationToken |
Hoe: Kleine luslichamen versnellen | Beschrijft een manier om de uitvoering te versnellen wanneer een luslichaam erg klein is. |
Taakparallelbibliotheek (TPL) | Biedt een overzicht van de taakparallelbibliotheek. |
Parallel programmeren | Introduceert parallelle programmering in .NET Framework. |