Programovanie

Práca s vláknami bezpečnými zbierkami: ConcurrentStack a ConcurrentQueue

Zbierky bezpečné pre vlákna boli prvýkrát predstavené v .Net 4 zavedením menného priestoru System.Collections.Concurrent. Typy kolekcie v mennom priestore System.Collections.Concurrent obsahujú kolekciu tried bezpečných vlákien.

ConcurrentStack

Zásobník je dátová štruktúra, ktorá funguje na báze LIFO (last in first out). Trieda ConcurrentStack je vláknovo bezpečný náprotivok generickej triedy Stack. ConcurrentStack je trieda všeobecnej kolekcie bezpečnej pre vlákna, ktorá bola prvýkrát predstavená ako súčasť .Net Framework 4. Tu je zoznam dôležitých metód tejto triedy, ktoré ilustrujú možné operácie.

  1. Push (prvok T) - táto metóda sa používa na pridanie údajov typu T.
  2. PushRange - touto metódou je možné pridať pole položiek typu T.
  3. TryPop (out T) - táto metóda sa používa na získanie prvého prvku zo zásobníka. Pri úspechu sa vráti pravda, inak inak.
  4. TryPeek (out T) - táto metóda sa používa na načítanie nasledujúceho prvku zo zásobníka, ale neodstráni ho zo zásobníka. Upozorňujeme, že podobne ako v prípade metódy TryPop (out T), vráti true pri úspechu a false inak.
  5. TryPopRange - táto metóda je preťažená a funguje podobne ako TryPop, ale používa sa na načítanie polí zo zásobníka.

Tu je príklad, ako môžete vytvoriť inštanciu triedy ConcurrentStack a vložiť do nej údaje.

ConcurrentStack concurrentStack = nový ConcurrentStack ();

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

{

concurrentStack.Push (index);

}

Ak chcete načítať prvky zo súbežného zásobníka, môžete využiť metódu TryPop (out T), ako je uvedené nižšie.

Údaje Int32;

bool success = concurrentStack.TryPop (out data);

Nasledujúci zoznam kódov ilustruje, ako môžete ukladať a načítať údaje do a zo súbežného zásobníka.

static void Main (reťazec [] args)

       {

ConcurrentStack concurrentStack = nový ConcurrentStack ();

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

           {

concurrentStack.Push (index);

           }

while (concurrentStack.Count> 0)

           {

Údaje Int32;

bool success = concurrentStack.TryPop (out data);

ak (úspech)

              {

Console.WriteLine (údaje);

               }

           }

Console.Read ();

       }

Po vykonaní vyššie uvedeného výpisu kódov sa čísla 0 až 99 zobrazia v opačnom poradí ako v okne konzoly.

ConcurrentQueue

Fronta je dátová štruktúra, ktorá funguje na báze FIFO (prvý do prvého von). Trieda ConcurrentQueue v .Net funguje ako vláknový bezpečný všeobecný front založený na FIFO.

Nasleduje zoznam dôležitých metód v triede ConcurrentQueue.

  1. Enqueue (T element) - táto metóda sa používa na pridanie položky typu T do frontu
  2. TryPeek (out T) - táto metóda sa používa na získanie nasledujúceho prvku z frontu, ale neodstráni ho z frontu. Táto metóda vráti true pri úspechu a false, ak zlyhá.
  3. TryDequeue (out T) - táto metóda sa používa na získanie prvého prvku z frontu. Na rozdiel od metódy TryPeek (out T) odstráni prvok z poradia. Táto metóda vracia hodnotu true pri úspechu a hodnotu false inak.

Nasledujúci úryvok kódu ukazuje, ako môžete vytvoriť inštanciu triedy ConcurrentQueue na ukladanie celých čísel.

ConcurrentQueue concurrentQueue = nový ConcurrentQueue ();

Na ukladanie prvkov do inštancie súbežného frontu môžete využiť metódu Enqueue, ako je uvedené nižšie.

concurrentQueue.Enqueue (100);

Nasledujúci zoznam kódov ilustruje, ako môžete ukladať a načítať prvky do a zo súbežného frontu.

ConcurrentQueue concurrentQueue = nový ConcurrentQueue ();

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

{

concurrentQueue.Enqueue (index);

}

Položka Int32;

while (concurrentQueue.TryDequeue (out item))

{

Console.WriteLine (položka);

}

Po vykonaní vyššie uvedeného výpisu kódov sa v okne konzoly zobrazia čísla 0 až 99.

Upozorňujeme, že triedy ConcurrentStack aj ConcurrentQueue sú bezpečné z hľadiska vlákien a môžu interne spravovať problémy so zamykaním a synchronizáciou.

Súbežnú inštanciu frontu môžete tiež previesť na pole uskutočnením hovoru na metódu ToArray (). Nasledujúci úryvok kódu ilustruje, ako je to možné dosiahnuť.

ConcurrentQueue concurrentQueue = nový ConcurrentQueue ();

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

concurrentQueue.Enqueue (index);

Int32 [] integerArray = concurrentQueue.ToArray ();

foreach (int i v integerArray)

{

Console.WriteLine (i);

}

Vlastnosť IsEmpty triedy ConcurrentQueue vracia hodnotu true, pokiaľ je kolekcia prázdna, inak je hodnota false. Nasledujúci úryvok kódu ukazuje, ako môžete túto metódu použiť.

ConcurrentQueue concurrentQueue = nový ConcurrentQueue ();

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

concurrentQueue.Enqueue (index);

while (! concurrentQueue.IsEmpty)

{

Výsledok Int32;

concurrentQueue.TryDequeue (out výsledok);

Console.WriteLine (výsledok);

}

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