Programmering

Arbejde med trådsikre samlinger: ConcurrentStack og ConcurrentQueue

Trådsikre samlinger blev først introduceret i .Net 4 med introduktionen af ​​System.Collections.Concurrent namespace. Samlingstyperne i System.Collections.Concurrent navneområdet indeholder en samling af trådsikre samlingsklasser.

ConcurrentStack

En stak er en datastruktur, der fungerer på basis af LIFO (sidst ind først ud). ConcurrentStack-klassen er en trådsikker modstykke til den generiske Stack-klasse. ConcurrentStack er en trådsikker generisk samlingsklasse, der først blev introduceret som en del af .Net Framework 4. Her er listen over de vigtige metoder i denne klasse, der illustrerer de mulige operationer.

  1. Push (T-element) - denne metode bruges til at tilføje data af typen T.
  2. PushRange - denne metode kan bruges til at tilføje en række elementer af typen T.
  3. TryPop (ud T) - denne metode bruges til at hente det første element fra stakken. Det vender tilbage efter succes, ellers falskt.
  4. TryPeek (ud T) - denne metode bruges til at hente det næste element fra stakken, men det fjerner ikke elementet fra stakken. Bemærk, at det svarer til TryPop (out T) -metoden, at det returnerer sandt ved succes og ellers falsk.
  5. TryPopRange - denne metode er overbelastet og fungerer svarende til TryPop, men bruges til at hente arrays fra stakken

Sådan kan du oprette en forekomst af klassen ConcurrentStack og skubbe data til den.

ConcurrentStack concurrentStack = ny ConcurrentStack ();

for (Int32 indeks = 0; indeks <10; indeks ++)

{

concurrentStack.Push (indeks);

}

For at hente elementerne ud af en samtidig stak kan du udnytte metoden TryPop (ud T) som vist nedenfor.

Int32 data;

bool succes = concurrentStack.TryPop (ud data);

Følgende kodeliste illustrerer, hvordan du kan gemme og hente data til og fra en samtidig stak.

statisk ugyldigt Main (streng [] args)

       {

ConcurrentStack concurrentStack = ny ConcurrentStack ();

for (Int32 indeks = 0; indeks <100; indeks ++)

           {

concurrentStack.Push (indeks);

           }

while (concurrentStack.Count> 0)

           {

Int32 data;

bool succes = concurrentStack.TryPop (ud data);

hvis (succes)

              {

Console.WriteLine (data);

               }

           }

Console.Read ();

       }

Når du udfører ovenstående kodeliste, vises tallene 0 til 99 i omvendt rækkefølge i konsolvinduet.

ConcurrentQueue

En kø er en datastruktur, der fungerer på basis af FIFO (først ind først ud). ConcurrentQueue-klassen i .Net fungerer som en trådsikker FIFO-baseret generisk kø.

Følgende er en liste over de vigtige metoder i klassen ConcurrentQueue.

  1. Enqueue (T-element) - denne metode bruges til at føje et element af type T til køen
  2. TryPeek (ud T) - denne metode bruges til at hente det næste element fra køen, men det fjerner ikke elementet fra køen. Denne metode returnerer sandt efter succes og falsk, når den mislykkes.
  3. TryDequeue (ud T) - denne metode bruges til at hente det første element fra køen. I modsætning til TryPeek (ud T) -metoden fjerner det elementet fra køen. Denne metode vender tilbage efter succes og ellers falsk.

Følgende kodestykke viser, hvordan du kan oprette en forekomst af klassen ConcurrentQueue for at gemme heltal.

ConcurrentQueue concurrentQueue = ny ConcurrentQueue ();

For at gemme elementer i den samtidige køforekomst kan du drage fordel af Enqueue-metoden som vist nedenfor.

concurrentQueue.Enqueue (100);

Følgende kodeliste illustrerer, hvordan du kan gemme og hente elementer til og fra en samtidig kø.

ConcurrentQueue concurrentQueue = ny ConcurrentQueue ();

for (int index = 0; index <100; index ++)

{

concurrentQueue.Enqueue (indeks);

}

Int32-vare;

while (concurrentQueue.TryDequeue (ud-vare))

{

Console.WriteLine (vare);

}

Når du udfører ovenstående kodeliste, vises tallene 0 til 99 i konsolvinduet.

Bemærk, at både ConcurrentStack- og ConcurrentQueue-klasser er trådsikre, og de kan håndtere låse- og synkroniseringsproblemer internt.

Du kan også konvertere den samtidige køforekomst til en matrix ved at foretage et opkald til ToArray () -metoden. Følgende kodestykke illustrerer, hvordan dette kan opnå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);

}

Egenskaben IsEmpty i klassen ConcurrentQueue returnerer sand, hvis samlingen er tom, ellers falsk. Følgende kodestykke viser, hvordan du kan bruge denne metode.

ConcurrentQueue concurrentQueue = ny ConcurrentQueue ();

for (Int32 indeks = 0; indeks <100; indeks ++)

concurrentQueue.Enqueue (indeks);

while (! concurrentQueue.IsEmpty)

{

Int32 resultat;

concurrentQueue.TryDequeue (ud resultat);

Console.WriteLine (resultat);

}