Collecties die zijn geïntroduceerd in het .NET Framework 1.0 zijn te vinden in de naamruimte System.Collections. Deze collecties, waaronder de veelgebruikte ArrayList en Hashtable, bieden een soort thread-veiligheid via de Synchronized-eigenschap, die een thread-safe wrapper teruggeeft die aan de collectie hoort. De wrapper werkt door de hele set te vergrendelen voor elke toevoeg- of verwijderingsbewerking. Daarom moet elke thread die toegang probeert tot de collectie te bereiken wachten tot het zijn beurt is om de lock te verkrijgen. Dit is niet schaalbaar en zal leiden tot een aanzienlijke prestatievermindering voor grote collecties. Bovendien voorkomt dit ontwerp conflicten niet volledig. Voor meer informatie, zie de volgende pagina op de MSDN-website: Synchronisatie in generieke collecties
De collectieklasse die in het .NET Framework 2.0 is geïntroduceerd, is te vinden in de naamruimte System.Collections.Generic. Deze verzamelingsklassen omvatten Lijst<T>, Woordenboek< TKey, TValue> enzovoort. Deze klassen bieden hogere typebeveiliging en prestaties vergeleken met .NET Framework 1.0-klassen. De .NET Framework 2.0 verzamelklasse biedt echter geen thread-synchronisatie; Bij het toevoegen of verwijderen van items op meerdere threads tegelijk, moet de gebruikerscode alle synchronisatie bieden.
We raden aan om gelijktijdige verzamelklassen te gebruiken in .NET Framework 4, omdat deze niet alleen de typebeveiliging van de .NET Framework 2.0-verzamelklassen bieden, maar ook efficiëntere en completere threadbeveiliging bieden dan de threadbeveiliging die wordt geboden door de .NET Framework 1.0-collectie.
Sommige gelijktijdige verzamelingstypen gebruiken lichtgewicht synchronisatiemechanismen zoals SpinLock, SpinWait, SemaphoreSlim en CountdownEvent, die nieuw zijn in het .NET Framework 4. Typisch gebruiken de bovenstaande synchronisatietypen "busy spinning" voor een korte periode voordat de thread in de daadwerkelijke wachttoestand wordt geplaatst. Als de wachttijd naar verwachting erg kort zal zijn, zal de spin veel minder rekenkracht verbruiken dan de wachttijd, wat kernelconversies vereist die veel resources verbruiken. Voor verzamelklassen die rotatie gebruiken, betekent deze efficiëntie dat meerdere threads items zeer snel kunnen toevoegen en verwijderen. Voor meer informatie over beperken en blokkeren, zie SpinLock en SpinWait. De<T> ConcurrentQueue- en ConcurrentStack-klassen<T> gebruiken helemaal geen sloten. In plaats daarvan vertrouwen ze op Interlock-operaties voor de veiligheid van de draad.
illustreren
Omdat gelijktijdige verzamelingsklassen ICollection ondersteunen, bieden ze implementaties voor de eigenschappen IsSynchronized en SyncRoot, zelfs als ze niet gerelateerd zijn. IsSynchronized geeft altijd false terug, terwijl SyncRoot altijd null is (niets in Visual Basic).
De volgende tabel geeft een overzicht van de verzamelingstypen in de naamruimte System.Collections.Concurrent.
type | beschrijving | BlockingCollection<T> | Biedt<T> elk type throttling en blocking voor het implementeren van IProducerConsumerCollection. Voor meer informatie, zie Overzicht van BlockingCollection. | ConcurrentDictionary<TKey, TValue> | Key/value is een thread-veilige implementatie van het woordenboek. | ConcurrentQueue<T> | Thread-veiligheidsimplementatie van FIFO (first in, first out) wachtrijen. | ConcurrentStack<T> | Thread-veilige implementatie van LIFO (last-in, first-out) stacks. | ConcurrentBag<T> | Thread-veilige implementatie van een out-of-order verzameling elementen. | IProducerConsumerCollection<T> | Types moeten worden geïmplementeerd inBlockingCollectionInterfaces gebruikt in de
|
|