Delen via


Gegevensstructuren voor parallelle programmering

.NET biedt verschillende typen die nuttig zijn in parallelle programmering, waaronder een set gelijktijdige verzamelingsklassen, lichtgewicht synchronisatieprimitief en typen voor luie initialisatie. U kunt deze typen gebruiken met elke toepassingscode met meerderereads, waaronder de taakparallelbibliotheek en PLINQ.

Gelijktijdige verzamelingsklassen

De verzamelingsklassen in de System.Collections.Concurrent naamruimte bieden threadveilige bewerkingen voor toevoegen en verwijderen die waar mogelijk vergrendelingen voorkomen en fijnmazige vergrendelingen gebruiken waar vergrendelingen nodig zijn. Voor een gelijktijdige verzamelingsklasse is geen gebruikerscode vereist om vergrendelingen te maken wanneer deze items opent. De gelijktijdige verzamelingsklassen kunnen de prestaties aanzienlijk verbeteren ten opzichte van typen, zoals System.Collections.ArrayList en System.Collections.Generic.List<T> (met door de gebruiker geïmplementeerde vergrendeling) in scenario's waarin meerdere threads items toevoegen aan en verwijderen uit een verzameling.

De volgende tabel bevat de gelijktijdige verzamelingsklassen:

Type Description
System.Collections.Concurrent.BlockingCollection<T> Biedt blokkerings- en begrenzingsmogelijkheden voor threadveilige verzamelingen die worden geïmplementeerd System.Collections.Concurrent.IProducerConsumerCollection<T>. Producentthreadsblok als er geen sleuven beschikbaar zijn of als de verzameling vol is. Consumententhreads blokkeren als de verzameling leeg is. Dit type ondersteunt ook niet-blokkerende toegang door consumenten en producenten. BlockingCollection<T> kan worden gebruikt als basisklasse of back-uparchief om blokkering en begrenzing te bieden voor elke verzamelingsklasse die ondersteuning biedt IEnumerable<T>.
System.Collections.Concurrent.ConcurrentBag<T> Een thread-safe bag-implementatie die schaalbare bewerkingen voor toevoegen en ophalen biedt.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> Een gelijktijdig en schaalbaar woordenlijsttype.
System.Collections.Concurrent.ConcurrentQueue<T> Een gelijktijdige en schaalbare FIFO-wachtrij.
System.Collections.Concurrent.ConcurrentStack<T> Een gelijktijdige en schaalbare LIFO-stack.

Zie Thread-Safe Collections voor meer informatie.

Synchronisatie primitiefen

De synchronisatieprimitieven in de System.Threading naamruimte maken fijnmazige gelijktijdigheid en snellere prestaties mogelijk door dure vergrendelingsmechanismen in verouderde multithreading-code te voorkomen.

De volgende tabel bevat de synchronisatietypen:

Type Description
System.Threading.Barrier Hiermee kunnen meerdere threads parallel aan een algoritme werken door een punt op te geven waarop elke taak de aankomst kan signaleren en vervolgens kan blokkeren totdat sommige of alle taken zijn aangekomen. Zie Barrier voor meer informatie.
System.Threading.CountdownEvent Vereenvoudigt fork- en join-scenario's door een eenvoudig rendezvous-mechanisme te bieden. Zie CountdownEvent voor meer informatie.
System.Threading.ManualResetEventSlim Een synchronisatieprimitief dat vergelijkbaar is met System.Threading.ManualResetEvent. ManualResetEventSlim is lichter, maar kan alleen worden gebruikt voor communicatie tussen processen.
System.Threading.SemaphoreSlim Een synchronisatieprimitief dat het aantal threads beperkt dat gelijktijdig toegang heeft tot een resource of een pool met resources. Zie Semaphore en SemaphoreSlim voor meer informatie.
System.Threading.SpinLock Een wederzijdse uitsluitingsvergrendelingsprimitief die ervoor zorgt dat de thread die de vergrendeling probeert te verkrijgen, gedurende een bepaalde periode in een lus moet wachten of draaien voordat het kwantum wordt opgehaald. In scenario's waarin het wachten op de vergrendeling naar verwachting kort is, SpinLock biedt het betere prestaties dan andere vormen van vergrendeling. Zie SpinLock voor meer informatie.
System.Threading.SpinWait Een klein, lichtgewicht type dat gedurende een opgegeven tijd draait en uiteindelijk de thread in een wachtstatus plaatst als het aantal kringlijnen wordt overschreden. Zie SpinWait voor meer informatie.

Zie voor meer informatie:

Luie initialisatieklassen

Bij luie initialisatie wordt het geheugen voor een object pas toegewezen als het nodig is. Luie initialisatie kan de prestaties verbeteren door objecttoewijzingen gelijkmatig over de levensduur van een programma te spreiden. U kunt luie initialisatie inschakelen voor elk aangepast type door het type Lazy<T>te verpakken.

De volgende tabel bevat de typen luie initialisatie:

Type Description
System.Lazy<T> Biedt lichtgewicht, thread-veilige lazy-initialisatie.
System.Threading.ThreadLocal<T> Biedt een vertraagde, geïnitialiseerde waarde per thread, waarbij elke thread de initialisatiefunctie aanroept.
System.Threading.LazyInitializer Biedt statische methoden waarmee u geen toegewezen, luie initialisatie-exemplaar hoeft toe te wijzen. In plaats daarvan gebruiken ze verwijzingen om ervoor te zorgen dat doelen zijn geïnitialiseerd wanneer ze worden geopend.

Zie Lazy Initialisatie voor meer informatie.

Geaggregeerde uitzonderingen

Het System.AggregateException type kan worden gebruikt om meerdere uitzonderingen vast te leggen die gelijktijdig worden gegenereerd op afzonderlijke threads en deze als één uitzondering terug te sturen naar de samenvoegingsthread. De System.Threading.Tasks.Task en System.Threading.Tasks.Parallel typen en PLINQ gebruiken AggregateException uitgebreid voor dit doel. Zie Uitzonderingsafhandeling en procedures voor meer informatie: Uitzonderingen verwerken in een PLINQ-query.

Zie ook