Dela via


Datastrukturer för parallell programmering

.NET innehåller flera typer som är användbara i parallell programmering, inklusive en uppsättning samtidiga samlingsklasser, enkla synkroniseringsprimitiver och typer för lat initiering. Du kan använda de här typerna med valfri programkod med flera program, inklusive Aktivitetsparallellt bibliotek och PLINQ.

Samtidiga samlingsklasser

Samlingsklasserna i System.Collections.Concurrent namnområdet tillhandahåller trådsäkra åtgärder för att lägga till och ta bort åtgärder som undviker lås där det är möjligt och använder detaljerad låsning där lås krävs. En samtidig samlingsklass kräver inte att användarkoden tar några lås när den kommer åt objekt. De samtidiga samlingsklasserna kan avsevärt förbättra prestanda för typer som System.Collections.ArrayList och System.Collections.Generic.List<T> (med användarindelad låsning) i scenarier där flera trådar lägger till och tar bort objekt från en samling.

I följande tabell visas de samtidiga samlingsklasserna:

Typ Beskrivning
System.Collections.Concurrent.BlockingCollection<T> Tillhandahåller funktioner för blockering och avgränsning för trådsäkra samlingar som implementerar System.Collections.Concurrent.IProducerConsumerCollection<T>. Producenttrådar blockeras om inga platser är tillgängliga eller om samlingen är full. Konsumenttrådar blockerar om samlingen är tom. Den här typen stöder också icke-blockerande åtkomst från konsumenter och producenter. BlockingCollection<T> kan användas som basklass eller lagringsplats för att tillhandahålla blockering och avgränsning för alla samlingsklasser som stöder IEnumerable<T>.
System.Collections.Concurrent.ConcurrentBag<T> En trådsäker påse-implementering som ger skalbara åtgärder för att lägga till och hämta.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> En samtidig och skalbar ordlistetyp.
System.Collections.Concurrent.ConcurrentQueue<T> En samtidig och skalbar FIFO-kö.
System.Collections.Concurrent.ConcurrentStack<T> En samtidig och skalbar LIFO-stack.

Mer information finns i Thread-Valv Collections (Tråd-Valv-samlingar).

Synkroniserings primitiver

Synkroniseringens primitiver i System.Threading namnområdet möjliggör detaljerad samtidighet och snabbare prestanda genom att undvika dyra låsmekanismer som finns i äldre flertrådskod.

I följande tabell visas synkroniseringstyperna:

Typ Beskrivning
System.Threading.Barrier Gör att flera trådar kan arbeta med en algoritm parallellt genom att tillhandahålla en punkt där varje uppgift kan signalera sin ankomst och sedan blockera tills vissa eller alla uppgifter har anlänt. Mer information finns i Barriär.
System.Threading.CountdownEvent Förenklar förgrenings- och kopplingsscenarier genom att tillhandahålla en enkel rendezvous-mekanism. Mer information finns i CountdownEvent.
System.Threading.ManualResetEventSlim En synkroniseringspri primitiv som liknar System.Threading.ManualResetEvent. ManualResetEventSlim är lättare men kan endast användas för kommunikation mellan processer.
System.Threading.SemaphoreSlim En synkroniseringsprimär som begränsar antalet trådar som samtidigt kan komma åt en resurs eller en resurspool. Mer information finns i Semafor och SemaphoreSlim.
System.Threading.SpinLock Ett ömsesidigt exkluderingslås primitivt som gör att tråden som försöker hämta låset väntar i en loop, eller snurrar, under en tidsperiod innan den ger sitt kvantum. I scenarier där väntan på låset förväntas bli kort ger SpinLock bättre prestanda än andra former av låsning. Mer information finns i SpinLock.
System.Threading.SpinWait En liten, lättviktig typ som snurrar under en angiven tid och så småningom försätter tråden i väntetillstånd om spinnantalet överskrids. Mer information finns i SpinWait.

Mer information finns i:

Lata initieringsklasser

Med lat initiering allokeras inte minnet för ett objekt förrän det behövs. Lat initiering kan förbättra prestanda genom att sprida objektallokeringar jämnt över programmets livslängd. Du kan aktivera lat initiering för alla anpassade typer genom att omsluta typen Lazy<T>.

I följande tabell visas de lata initieringstyperna:

Typ Beskrivning
System.Lazy<T> Ger enkel, trådsäker lazy-initiering.
System.Threading.ThreadLocal<T> Ger ett lättsinnigt initierat värde per tråd, där varje tråd lätt anropar initieringsfunktionen.
System.Threading.LazyInitializer Tillhandahåller statiska metoder som undviker behovet av att allokera en dedikerad instans med lat initiering. I stället använder de referenser för att säkerställa att målen har initierats när de används.

Mer information finns i Lazy Initialization (Lat initiering).

Aggregerade undantag

Typen System.AggregateException kan användas för att samla in flera undantag som genereras samtidigt på separata trådar och returnera dem till kopplingstråden som ett enda undantag. Typerna System.Threading.Tasks.Task och System.Threading.Tasks.Parallel och PLINQ används AggregateException i stor utsträckning för detta ändamål. Mer information finns i Undantagshantering och Så här hanterar du undantag i en PLINQ-fråga.

Se även