Programování

Práce se sbírkami bezpečnými pro vlákna: ConcurrentStack a ConcurrentQueue

Shromáždění bezpečných vláken bylo poprvé představeno v .Net 4 zavedením oboru názvů System.Collections.Concurrent. Typy kolekce v oboru názvů System.Collections.Concurrent obsahuje kolekci tříd bezpečné kolekce podprocesů.

Souběžný útok

Zásobník je datová struktura, která funguje na základě LIFO (last in first out). Třída ConcurrentStack je vláknově bezpečný protějšek obecné třídy Stack. ConcurrentStack je vláknová bezpečná obecná třída kolekce, která byla poprvé představena jako součást .Net Framework 4. Zde je seznam důležitých metod této třídy, které ilustrují možné operace.

  1. Push (prvek T) - tato metoda se používá k přidání dat typu T.
  2. PushRange - tuto metodu lze použít k přidání pole položek typu T.
  3. TryPop (out T) - tato metoda se používá k načtení prvního prvku ze zásobníku. Vrací true při úspěchu, jinak false.
  4. TryPeek (out T) - tato metoda se používá k načtení dalšího prvku ze zásobníku, ale neodstraní prvek ze zásobníku. Všimněte si, že podobně jako metoda TryPop (out T) vrací true při úspěchu a false jinak.
  5. TryPopRange - tato metoda je přetížená a funguje podobně jako TryPop, ale používá se k načítání polí ze zásobníku

Zde je ukázka, jak můžete vytvořit instanci třídy ConcurrentStack třídy a odeslat do ní data.

ConcurrentStack concurrentStack = nový ConcurrentStack ();

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

{

concurrentStack.Push (index);

}

Chcete-li načíst prvky ze souběžného zásobníku, můžete využít metodu TryPop (out T), jak je znázorněno níže.

Data Int32;

bool success = concurrentStack.TryPop (out data);

Následující výpis kódu ukazuje, jak můžete ukládat a načítat data do a ze souběžného zásobníku.

static void Main (řetězec [] args)

       {

ConcurrentStack concurrentStack = nový ConcurrentStack ();

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

           {

concurrentStack.Push (index);

           }

while (concurrentStack.Count> 0)

           {

Data Int32;

bool success = concurrentStack.TryPop (out data);

pokud (úspěch)

              {

Console.WriteLine (data);

               }

           }

Console.Read ();

       }

Když provedete výše uvedený seznam kódů, budou se v okně konzoly zobrazovat čísla 0 až 99 v opačném pořadí.

Souběžná fronta

Fronta je datová struktura, která funguje na základě FIFO (first in first out). Třída ConcurrentQueue v .Net funguje jako vláknová bezpečná obecná fronta založená na FIFO.

Následuje seznam důležitých metod ve třídě ConcurrentQueue.

  1. Enqueue (prvek T) - tato metoda se používá k přidání položky typu T do fronty
  2. TryPeek (out T) - tato metoda se používá k načtení dalšího prvku z fronty, ale neodstraní prvek z fronty. Tato metoda vrací true při úspěchu a false při selhání.
  3. TryDequeue (out T) - tato metoda se používá k načtení prvního prvku z fronty. Na rozdíl od metody TryPeek (out T) odebere prvek z fronty. Tato metoda vrací true při úspěchu a false jinak.

Následující fragment kódu ukazuje, jak můžete vytvořit instanci třídy ConcurrentQueue třídy pro ukládání celých čísel.

ConcurrentQueue concurrentQueue = nový ConcurrentQueue ();

K uložení prvků do instance souběžné fronty můžete využít metodu Enqueue, jak je znázorněno níže.

concurrentQueue.Enqueue (100);

Následující výpis kódu ukazuje, jak můžete ukládat a načítat prvky do a ze souběžné fronty.

ConcurrentQueue concurrentQueue = nový ConcurrentQueue ();

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

{

concurrentQueue.Enqueue (index);

}

Položka Int32;

while (concurrentQueue.TryDequeue (out item))

{

Console.WriteLine (položka);

}

Když provedete výše uvedený seznam kódů, v okně konzoly se zobrazí čísla 0 až 99.

Všimněte si, že obě třídy ConcurrentStack a ConcurrentQueue jsou bezpečné pro vlákna a mohou interně spravovat problémy se zamykáním a synchronizací.

Instanci souběžné fronty můžete také převést na pole provedením volání metody ToArray (). Následující fragment kódu ukazuje, jak toho lze dosáhnout.

ConcurrentQueue concurrentQueue = nový ConcurrentQueue ();

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

concurrentQueue.Enqueue (index);

Int32 [] integerArray = concurrentQueue.ToArray ();

foreach (int i v integerArray)

{

Console.WriteLine (i);

}

Vlastnost IsEmpty třídy ConcurrentQueue vrací true, pokud je kolekce prázdná, jinak false. Následující fragment kódu ukazuje, jak můžete tuto metodu použít.

ConcurrentQueue concurrentQueue = nový ConcurrentQueue ();

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

concurrentQueue.Enqueue (index);

while (! concurrentQueue.IsEmpty)

{

Výsledek Int32;

concurrentQueue.TryDequeue (out výsledek);

Console.WriteLine (výsledek);

}

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