Rad s kolekcijama sigurnim za nit: ConcurrentStack i ConcurrentQueue

Sigurne kolekcije niti prvi put su predstavljene u .Net 4 uvođenjem prostora imena System.Collections.Concurrent. Tipovi zbirki u imenskom prostoru System.Collections.Concurrent sadrže kolekciju klasa kolekcija sigurnih za nit.

ConcurrentStack

Stog je struktura podataka koja radi na LIFO (zadnji ulaz prvi izlaz). Klasa ConcurrentStack nit je sigurna kolona generičke klase Stack. ConcurrentStack je generička klasa kolekcije sigurna za nit koja je prvi put predstavljena kao dio .Net Framework 4. Evo popisa važnih metoda ove klase koje ilustriraju moguće operacije.

  1. Push (T element) - ovom se metodom dodaju podaci tipa T.
  2. PushRange - ovom se metodom može dodati niz predmeta tipa T.
  3. TryPop (out T) - ova metoda koristi se za dohvaćanje prvog elementa iz stoga. Vrati se istina na uspjeh, inače lažno.
  4. TryPeek (out T) - ova metoda koristi se za dohvaćanje sljedećeg elementa iz stoga, ali ne uklanja element iz stoga. Imajte na umu da slično metodi TryPop (out T) vraća true u slučaju uspjeha, a false u suprotnom.
  5. TryPopRange - ova je metoda preopterećena i radi slično kao TryPop, ali koristi se za dohvaćanje nizova iz stoga

Evo kako možete stvoriti instancu klase ConcurrentStack i u nju poslati podatke.

ConcurrentStack concurrentStack = new ConcurrentStack();

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

{

       concurrentStack.Push(index);

}

Da biste dohvatili elemente iz istodobnog snopa, možete koristiti metodu TryPop (out T) kao što je prikazano u nastavku.

Int32 data;

bool success = concurrentStack.TryPop(out data);

Sljedeći popis kodova ilustrira kako možete pohraniti i dohvatiti podatke u i iz istodobnog stoga.

static void Main(string[] args)

       {

           ConcurrentStack concurrentStack = new ConcurrentStack();

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

           {

               concurrentStack.Push(index);

           }

           while (concurrentStack.Count > 0)

           {

               Int32 data;

               bool success = concurrentStack.TryPop(out data);

               if (success)

              {

                   Console.WriteLine(data);

               }

           }

           Console.Read();

       }

Kada izvršite gornji popis kodova, brojevi od 0 do 99 prikazat će se obrnutim redoslijedom na prozoru konzole.

ConcurrentQueue

Red čekanja je struktura podataka koja radi na temelju FIFO-a (prvi u prvom izlazu). Klasa ConcurrentQueue u .Netu djeluje kao FIFO generički red zasnovan na nitima.

Slijedi popis važnih metoda u klasi ConcurrentQueue.

  1. Enqueue (T element) - ovom se metodom dodaje stavka tipa T u red čekanja
  2. TryPeek (out T) - ova metoda koristi se za dohvaćanje sljedećeg elementa iz reda, ali ne uklanja element iz reda. Ova metoda vraća true na uspjeh i false kada ne uspije.
  3. TryDequeue (out T) - ova se metoda koristi za dohvaćanje prvog elementa iz reda. Suprotno metodi TryPeek (out T), on uklanja element iz reda. Ova metoda vraća true na uspjeh i false u suprotnom.

Sljedeći isječak koda pokazuje kako možete stvoriti instancu klase ConcurrentQueue za pohranu cijelih brojeva.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

Za spremanje elemenata u istodobnu instancu reda možete iskoristiti metodu Enqueue kao što je prikazano u nastavku.

concurrentQueue.Enqueue(100);

Sljedeći popis kodova ilustrira kako možete pohraniti i dohvatiti elemente u i iz istodobnog reda čekanja.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

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

{

     concurrentQueue.Enqueue(index);

}

Int32 item;

while (concurrentQueue.TryDequeue(out item))

{

     Console.WriteLine(item);

}

Kada izvršite gornji popis kodova, brojevi od 0 do 99 prikazat će se na prozoru konzole.

Imajte na umu da su klase ConcurrentStack i ConcurrentQueue sigurne u niti i mogu interno upravljati problemima zaključavanja i sinkronizacije.

Također možete pretvoriti istodobnu instancu reda u niz upućivanjem poziva metodi ToArray (). Sljedeći isječak koda ilustrira kako se to može postići.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

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

   concurrentQueue.Enqueue(index);

Int32[] integerArray = concurrentQueue.ToArray();

foreach (int i in integerArray)

{

   Console.WriteLine(i);

}

Svojstvo IsEmpty klase ConcurrentQueue vraća true ako je zbirka prazna, inače false. Sljedeći isječak koda pokazuje kako možete koristiti ovu metodu.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

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

concurrentQueue.Enqueue(index);

while(!concurrentQueue.IsEmpty)

{

     Int32 result;

     concurrentQueue.TryDequeue(out result);

     Console.WriteLine(result);

}