Samlinger introdusert i .NET Framework 1.0 finnes i System.Collections-navnerommet. Disse samlingene, inkludert den vanlig brukte ArrayList og Hashtable, gir en form for trådsikkerhet gjennom Synchronized-egenskapen, som returnerer en trådsikker wrapper relatert til samlingen. Wrapperen fungerer ved å låse hele settet for hver til- eller fjerningsoperasjon. Derfor må hver tråd som prøver å få tilgang til samlingen vente til det er dens tur for å få tak i låsen. Dette er ikke skalerbart og vil føre til betydelig ytelsesforringelse for store samlinger. I tillegg forhindrer ikke dette designet fullstendig konkurranse. For mer informasjon, se følgende side på MSDNs nettside: Synkronisering i generiske samlinger
Samlingsklassen introdusert i .NET Framework 2.0 finnes i System.Collections.Generic navnerommet. Disse samlingsklassene inkluderer Liste<T>, Ordbok< TKey, TValue> osv. Disse klassene gir høyere typesikkerhet og ytelse sammenlignet med .NET Framework 1.0-klasser. Imidlertid tilbyr ikke .NET Framework 2.0-samlingsklassen noen trådsynkronisering; Når man legger til eller fjerner elementer på flere tråder samtidig, må brukerkoden sørge for all synkronisering.
Vi anbefaler at du bruker samtidige samlingsklasser i .NET Framework 4 fordi de ikke bare gir typesikkerheten til .NET Framework 2.0-samlingsklassene, men også mer effektiv og komplett trådsikkerhet enn trådsikkerheten som tilbys av .NET Framework 1.0-samlingen.
Noen samtidige samlingstyper bruker lette synkroniseringsmekanismer som SpinLock, SpinWait, SemaphoreSlim og CountdownEvent, som er nye i .NET Framework 4. Vanligvis bruker de ovennevnte synkroniseringstypene «busy spinning» i en kort periode før tråden settes i den faktiske ventetilstanden. Hvis ventetiden forventes å bli veldig kort, vil spinnet bruke mye mindre beregningsressurser enn ventetiden, noe som innebærer kjernekonverteringer som vil bruke mye ressurser. For samlingsklasser som bruker rotasjon, betyr denne effektiviteten at flere tråder kan legge til og fjerne elementer i svært raskt tempo. For mer informasjon om begrensning og blokkering, se SpinLock og SpinWait. ConcurrentQueue-<T> og<T> ConcurrentStack-klassene bruker ikke låser i det hele tatt. I stedet er de avhengige av sammenkoblede operasjoner for trådsikkerhet.
illustrere
Fordi samtidige samlingsklasser støtter ICollection, tilbyr de implementasjoner for IsSynchronized- og SyncRoot-egenskapene, selv om de ikke er relatert. IsSynchronized returnerer alltid false, mens SyncRoot alltid er null (ingenting i Visual Basic).
Følgende tabell viser samlingstypene i System.Collections.Concurrent-navnerommet.
type | beskrivelse | BlockingCollection<T> | Tilbyr<T> alle typer throttling og blokkering for implementering av IProducerConsumerCollection. For mer informasjon, se oversikt over BlockingCollection. | ConcurrentDictionary<TKey, TValue> | Key/value er trådsikker implementering av ordboken. | ConcurrentQueue<T> | Trådsikkerhetsimplementering av FIFO (first in, first out) køer. | ConcurrentStack<T> | Trådsikker implementering av LIFO (last-in, first-out) stabler. | ConcurrentBag<T> | Trådsikker implementering av en uordnet samling av elementer. | IProducerConsumerCollection<T> | typer må implementeres iBlockingCollectionGrensesnitt brukt i
|
|