Programmering

Arbeide med trådsikre samlinger: ConcurrentStack og ConcurrentQueue

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.

  1. Push (T-element) - denne metoden brukes til å legge til data av typen T.
  2. PushRange - denne metoden kan brukes til å legge til en rekke elementer av typen T.
  3. TryPop (ut T) - denne metoden brukes til å hente det første elementet fra bunken. Det blir sant når det lykkes, ellers falskt.
  4. 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.
  5. 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.

  1. Enqueue (T-element) - denne metoden brukes til å legge til et element av type T i køen
  2. 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.
  3. 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);

}

$config[zx-auto] not found$config[zx-overlay] not found