Programmēšana

Darbs ar pavedieniem drošām kolekcijām: ConcurrentStack un ConcurrentQueue

Drošas vītņu kolekcijas pirmo reizi tika ieviestas .Net 4, ieviešot System.Collections.Concurrent namespace. Kolekcijas veidi System.Collections.Concurrent nosaukumvietā satur pavedienu drošas kolekcijas klases kolekciju.

Vienlaicīga kaudze

Steks ir datu struktūra, kas darbojas, pamatojoties uz LIFO (pēdējais pirmais ārā). ConcurrentStack klase ir vispārējās kaudzes klases līdzīgs pavedieniem. ConcurrentStack ir pavedienu droša vispārīga kolekcijas klase, kas pirmo reizi tika ieviesta kā .Net Framework 4 sastāvdaļa. Šeit ir saraksts ar šīs klases svarīgākajām metodēm, kas ilustrē iespējamās darbības.

  1. Push (T elements) - šo metodi izmanto, lai pievienotu T tipa datus.
  2. PushRange - šo metodi var izmantot, lai pievienotu T tipa vienumu masīvu.
  3. TryPop (out T) - šo metodi izmanto, lai izgūtu pirmo elementu no kaudzes. Tas atgriežas pēc panākumiem, citādi - nepatiesi.
  4. TryPeek (out T) - šo metodi izmanto, lai izgūtu nākamo elementu no kaudzes, bet tas nenoņem elementu no kaudzes. Ņemiet vērā, ka līdzīgi kā TryPop (out T) metodei, tā atgriežas kā patiesa pēc panākumiem un nepatiesa citādi.
  5. TryPopRange - šī metode ir pārslogota un darbojas līdzīgi kā TryPop, bet tiek izmantota masīvu atgriešanai no kaudzes

Lūk, kā jūs varat izveidot klases ConcurrentStack instanci un nospiest tajā datus.

ConcurrentStack concurrentStack = new ConcurrentStack ();

par (Int32 indekss = 0; indekss <10; indekss ++)

{

concurrentStack.Push (indekss);

}

Lai izgūtu elementus no vienlaicīgas kaudzes, varat izmantot TryPop (out T) metodi, kā parādīts zemāk.

Int32 dati;

bool panākumi = concurrentStack.TryPop (datu izveide);

Šis kodu saraksts parāda, kā jūs varat uzglabāt un iegūt datus vienlaicīgā kaudzē un no tās.

static void Main (virkne [] args)

       {

ConcurrentStack concurrentStack = new ConcurrentStack ();

par (Int32 indekss = 0; indekss <100; indekss ++)

           {

concurrentStack.Push (indekss);

           }

while (concurrentStack.Count> 0)

           {

Int32 dati;

bool panākumi = concurrentStack.TryPop (datu izveide);

ja (veiksme)

              {

Console.WriteLine (dati);

               }

           }

Konsole. Lasīt ();

       }

Izpildot iepriekš minēto kodu sarakstu, skaitļi no 0 līdz 99 konsoles logā tiks parādīti apgrieztā secībā.

Vienlaicīga rinda

Rinda ir datu struktūra, kas darbojas, pamatojoties uz FIFO (first in first out). . ConcetQueue klase .Net darbojas kā diegiem droša FIFO balstīta vispārējā rinda.

Šis ir svarīgo metožu saraksts ConcurrentQueue klasē.

  1. Enqueue (T elements) - šo metodi izmanto, lai rindā pievienotu T veida vienumu
  2. TryPeek (out T) - šo metodi izmanto, lai izgūtu nākamo elementu no rindas, bet tas nenoņem elementu no rindas. Šī metode atgriežas kā veiksmīga un nepatiesa, ja tā neizdodas.
  3. TryDequeue (out T) - šo metodi izmanto, lai izgūtu pirmo elementu no rindas. Pretēji TryPeek (out T) metodei, tas noņem elementu no rindas. Šī metode atgriežas pēc panākumiem un nepatiesi citādi.

Šis koda fragments parāda, kā jūs varat izveidot klases ConcurrentQueue instanci veselu skaitļu glabāšanai.

ConcurrentQueue concurrentQueue = new ConcurrentQueue ();

Lai saglabātu elementus vienlaicīgajā rindas instancē, varat izmantot Enqueue metodes priekšrocības, kā parādīts zemāk.

concurrentQueue.Enqueue (100);

Šis kodu saraksts parāda, kā jūs varat saglabāt un izgūt elementus vienlaicīgajā rindā un no tās.

ConcurrentQueue concurrentQueue = new ConcurrentQueue ();

par (int indekss = 0; indekss <100; indekss ++)

{

concurrentQueue.Enqueue (indekss);

}

Int32 prece;

while (concurrentQueue.TryDequeue (no vienuma))

{

Console.WriteLine (vienums);

}

Izpildot iepriekš minēto kodu sarakstu, konsoles logā tiks parādīti skaitļi no 0 līdz 99.

Ņemiet vērā, ka gan ConcurrentStack, gan ConcurrentQueue klases ir drošas ar pavedieniem, un tās var iekšēji pārvaldīt bloķēšanas un sinhronizācijas problēmas.

Varat arī konvertēt vienlaicīgās rindas gadījumu masīvā, veicot izsaukumu uz metodi ToArray (). Šis koda fragments parāda, kā to var panākt.

ConcurrentQueue concurrentQueue = new ConcurrentQueue ();

par (Int32 indekss = 0; indekss <100; indekss ++)

concurrentQueue.Enqueue (indekss);

Int32 [] integerArray = concurrentQueue.ToArray ();

foreach (int i in integerArray)

{

Console.WriteLine (i);

}

Klases ConcurrentQueue rekvizīts IsEmpty atgriež vērtību true, ja kolekcija ir tukša, citādi nepatiesa. Šis koda fragments parāda, kā jūs varat izmantot šo metodi.

ConcurrentQueue concurrentQueue = new ConcurrentQueue ();

par (Int32 indekss = 0; indekss <100; indekss ++)

concurrentQueue.Enqueue (indekss);

while (! concurrentQueue.IsEmpty)

{

Int32 rezultāts;

concurrentQueue.TryDequeue (rezultāts nav sasniegts);

Console.WriteLine (rezultāts);

}

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