Arbeiten mit thread-sicheren Sammlungen: ConcurrentStack und ConcurrentQueue

Thread-sichere Sammlungen wurden erstmals in .Net 4 mit der Einführung des System.Collections.Concurrent-Namespace eingeführt. Die Auflistungstypen im Namespace System.Collections.Concurrent enthalten eine Auflistung threadsicherer Auflistungsklassen.

ConcurrentStack

Ein Stack ist eine Datenstruktur, die auf LIFO-Basis (last in first out) arbeitet. Die ConcurrentStack-Klasse ist ein thread-sicheres Gegenstück zur generischen Stack-Klasse. Der ConcurrentStack ist eine thread-sichere generische Auflistungsklasse, die erstmals als Teil von .Net Framework 4 eingeführt wurde. Hier ist die Liste der wichtigen Methoden dieser Klasse, die die möglichen Operationen veranschaulichen.

  1. Push (T-Element) - Mit dieser Methode werden Daten vom Typ T hinzugefügt.
  2. PushRange - Mit dieser Methode können Sie ein Array von Elementen vom Typ T hinzufügen.
  3. TryPop (out T) - Mit dieser Methode wird das erste Element vom Stapel abgerufen. Bei Erfolg wird true zurückgegeben, andernfalls false.
  4. TryPeek (out T) - Mit dieser Methode wird das nächste Element vom Stapel abgerufen, das Element wird jedoch nicht vom Stapel entfernt. Beachten Sie, dass ähnlich wie bei der TryPop (out T) -Methode bei Erfolg true und ansonsten false zurückgegeben wird.
  5. TryPopRange - Diese Methode ist überladen und funktioniert ähnlich wie TryPop, wird jedoch zum Abrufen von Arrays vom Stapel verwendet

So können Sie eine Instanz der ConcurrentStack-Klasse erstellen und Daten an diese übertragen.

ConcurrentStack concurrentStack = new ConcurrentStack();

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

{

       concurrentStack.Push(index);

}

Um die Elemente aus einem gleichzeitigen Stapel abzurufen, können Sie die TryPop-Methode (out T) wie unten gezeigt verwenden.

Int32 data;

bool success = concurrentStack.TryPop(out data);

Die folgende Codeliste zeigt, wie Sie Daten auf und von einem gleichzeitigen Stapel speichern und abrufen können.

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();

       }

Wenn Sie die obige Codeliste ausführen, werden die Nummern 0 bis 99 im Konsolenfenster in umgekehrter Reihenfolge angezeigt.

ConcurrentQueue

Eine Warteschlange ist eine Datenstruktur, die auf der Basis von FIFO (First In First Out) arbeitet. Die ConcurrentQueue-Klasse in .Net fungiert als thread-sichere FIFO-basierte generische Warteschlange.

Im Folgenden finden Sie eine Liste der wichtigen Methoden in der ConcurrentQueue-Klasse.

  1. Enqueue (T-Element) - Mit dieser Methode wird der Warteschlange ein Element vom Typ T hinzugefügt
  2. TryPeek (out T) - Mit dieser Methode wird das nächste Element aus der Warteschlange abgerufen, das Element wird jedoch nicht aus der Warteschlange entfernt. Diese Methode gibt bei Erfolg true und false zurück, wenn dies fehlschlägt.
  3. TryDequeue (out T) - Mit dieser Methode wird das erste Element aus der Warteschlange abgerufen. Im Gegensatz zur TryPeek (out T) -Methode wird das Element aus der Warteschlange entfernt. Diese Methode gibt bei Erfolg true und andernfalls false zurück.

Das folgende Codefragment zeigt, wie Sie eine Instanz der ConcurrentQueue-Klasse zum Speichern von Ganzzahlen erstellen können.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

Um Elemente in der gleichzeitigen Warteschlangeninstanz zu speichern, können Sie die unten gezeigte Enqueue-Methode nutzen.

concurrentQueue.Enqueue(100);

Die folgende Codeliste zeigt, wie Sie Elemente in und aus einer gleichzeitigen Warteschlange speichern und abrufen können.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

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

{

     concurrentQueue.Enqueue(index);

}

Int32 item;

while (concurrentQueue.TryDequeue(out item))

{

     Console.WriteLine(item);

}

Wenn Sie die obige Codeliste ausführen, werden die Nummern 0 bis 99 im Konsolenfenster angezeigt.

Beachten Sie, dass sowohl die ConcurrentStack- als auch die ConcurrentQueue-Klasse threadsicher sind und Sperr- und Synchronisierungsprobleme intern verwalten können.

Sie können die gleichzeitige Warteschlangeninstanz auch in ein Array konvertieren, indem Sie die ToArray () -Methode aufrufen. Das folgende Codefragment zeigt, wie dies erreicht werden kann.

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);

}

Die IsEmpty-Eigenschaft der ConcurrentQueue-Klasse gibt true zurück, wenn die Auflistung leer ist, andernfalls false. Das folgende Codefragment zeigt, wie Sie diese Methode verwenden können.

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);

}