Trådsikre samlinger ble først introdusert i .Net 4 med introduksjonen av System.Collections.Concurrent namespace. Samlingstypene i System.Collections.Concurrent namespace inneholder en samling trådsikre samlingsklasser.
ConcurrentStack
En stabel er en datastruktur som fungerer på LIFO (sist inn først ut) basis. ConcurrentStack-klassen er en trådsikker motstykke til den generiske Stack-klassen. ConcurrentStack er en trådsikker generisk samlingsklasse som først ble introdusert som en del av .Net Framework 4. Her er listen over viktige metoder i denne klassen som illustrerer mulige operasjoner.
- Push (T-element) - denne metoden brukes til å legge til data av typen T.
- PushRange - denne metoden kan brukes til å legge til en rekke elementer av typen T.
- TryPop (ut T) - denne metoden brukes til å hente det første elementet fra bunken. Det blir sant når det lykkes, ellers falskt.
- TryPeek (ut T) - denne metoden brukes til å hente neste element fra bunken, men det fjerner ikke elementet fra bunken. Vær oppmerksom på at i likhet med TryPop (ut T) -metoden, blir den sant når det lykkes og ellers.
- TryPopRange - denne metoden er overbelastet og fungerer i likhet med TryPop, men brukes til å hente matriser fra bunken
Slik kan du lage en forekomst av klassen ConcurrentStack og skyve data til den.
ConcurrentStack concurrentStack = ny ConcurrentStack ();
for (Int32 indeks = 0; indeks <10; indeks ++)
{
concurrentStack.Push (indeks);
}
For å hente elementene ut av en samtidig stabel, kan du utnytte TryPop (ut T) -metoden som vist nedenfor.
Int32 data;
bool suksess = concurrentStack.TryPop (ut data);
Følgende kodeliste illustrerer hvordan du kan lagre og hente data til og fra en samtidig stabel.
statisk tomrom Main (streng [] args)
{
ConcurrentStack concurrentStack = ny ConcurrentStack ();
for (Int32 indeks = 0; indeks <100; indeks ++)
{
concurrentStack.Push (indeks);
}
while (concurrentStack.Count> 0)
{
Int32 data;
bool suksess = concurrentStack.TryPop (ut data);
hvis (suksess)
{
Console.WriteLine (data);
}
}
Console.Read ();
}
Når du utfører kodelisten ovenfor, vises tallene 0 til 99 i omvendt rekkefølge i konsollvinduet.
ConcurrentQueue
En kø er en datastruktur som fungerer på grunnlag av FIFO (først inn først ut). ConcurrentQueue-klassen i .Net fungerer som en trådsikker FIFO-basert generisk kø.
Følgende er listen over viktige metoder i ConcurrentQueue-klassen.
- Enqueue (T-element) - denne metoden brukes til å legge til et element av type T i køen
- TryPeek (ut T) - denne metoden brukes til å hente neste element fra køen, men det fjerner ikke elementet fra køen. Denne metoden blir riktig når den lykkes og falsk når den mislykkes.
- TryDequeue (ut T) - denne metoden brukes til å hente det første elementet fra køen. I motsetning til TryPeek (ut T) -metoden fjerner den elementet fra køen. Denne metoden blir sant på suksess og ellers.
Følgende kodebit viser hvordan du kan opprette en forekomst av klassen ConcurrentQueue for å lagre heltall.
ConcurrentQueue concurrentQueue = ny ConcurrentQueue ();
For å lagre elementer i den samtidige køforekomsten kan du dra nytte av Enqueue-metoden som vist nedenfor.
concurrentQueue.Enqueue (100);
Følgende kodeliste illustrerer hvordan du kan lagre og hente elementer til og fra en samtidig kø.
ConcurrentQueue concurrentQueue = ny ConcurrentQueue ();
for (int indeks = 0; indeks <100; indeks ++)
{
concurrentQueue.Enqueue (indeks);
}
Int32-vare;
while (concurrentQueue.TryDequeue (ut element))
{
Console.WriteLine (vare);
}
Når du utfører kodelisten ovenfor, vil tallene 0 til 99 vises i konsollvinduet.
Merk at både ConcurrentStack- og ConcurrentQueue-klassene er trådsikre, og de kan håndtere låsing og synkroniseringsproblemer internt.
Du kan også konvertere den samtidige køforekomsten til en matrise ved å ringe til ToArray () -metoden. Følgende kodebit illustrerer hvordan dette kan oppnås.
ConcurrentQueue concurrentQueue = ny ConcurrentQueue ();
for (Int32 indeks = 0; indeks <100; indeks ++)
concurrentQueue.Enqueue (indeks);
Int32 [] integerArray = concurrentQueue.ToArray ();
foreach (int i in integerArray)
{
Console.WriteLine (i);
}
IsEmpty-egenskapen til ConcurrentQueue-klassen returnerer true er samlingen tom, ellers falsk. Følgende kodebit viser hvordan du kan bruke denne metoden.
ConcurrentQueue concurrentQueue = ny ConcurrentQueue ();
for (Int32 indeks = 0; indeks <100; indeks ++)
concurrentQueue.Enqueue (indeks);
while (! concurrentQueue.IsEmpty)
{
Int32 resultat;
concurrentQueue.TryDequeue (resultat)
Console.WriteLine (resultat);
}