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.
.NET biedt verschillende typen die nuttig zijn in parallelle programmering, waaronder een set gelijktijdige verzamelingsklassen, lichtgewicht synchronisatieprimitieven en typen voor trage initialisatie. U kunt deze typen gebruiken met elke multithreaded applicatiecode, inclusief de Task Parallel Library 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:
| Typologie | Beschrijving |
|---|---|
| System.Collections.Concurrent.BlockingCollection<T> | Biedt blokkeer- en begrenzingsfuncties voor thread-veilige verzamelingen die System.Collections.Concurrent.IProducerConsumerCollection<T> implementeren. Producerthreads blokkeren wanneer er geen slots beschikbaar zijn of de collectie 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 backingstore om blokkering en begrenzing te bieden voor elke verzamelingsklasse die IEnumerable<T> ondersteunt. |
| 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 Verzamelingenvoor 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:
| Typologie | Beschrijving |
|---|---|
| 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 verzamelpuntmechanisme 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 loop blijft wachten of draaien voordat het zijn kwantum opgeeft. 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 specifieke tijd spoort en uiteindelijk de thread in een wachttijd plaatst als het aantal spintellingen wordt overschreden. Zie SpinWait voor meer informatie. |
Voor meer informatie, zie:
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:
| Typologie | Beschrijving |
|---|---|
| System.Lazy<T> | Biedt een lichtgewicht en threadsafe manier van vertraagde initialisatie. |
| System.Threading.ThreadLocal<T> | Biedt een lui-geïnitieerde waarde op basis van elke thread, waarbij elke thread de initialisatiefunctie lui 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 Initializationvoor 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.