Utilisation de collections thread-safe: ConcurrentStack et ConcurrentQueue

Les collections thread-safe ont été introduites pour la première fois dans .Net 4 avec l'introduction de l'espace de noms System.Collections.Concurrent. Les types de collection dans l'espace de noms System.Collections.Concurrent contient une collection de classes de collection thread-safe.

ConcurrentStack

Une pile est une structure de données qui fonctionne sur la base LIFO (dernier entré, premier sorti). La classe ConcurrentStack est un équivalent thread-safe de la classe générique Stack. ConcurrentStack est une classe de collection générique thread-safe qui a été introduite pour la première fois dans le cadre de .Net Framework 4. Voici la liste des méthodes importantes de cette classe qui illustrent les opérations possibles.

  1. Push (élément T) - cette méthode est utilisée pour ajouter des données de type T.
  2. PushRange - cette méthode peut être utilisée pour ajouter un tableau d'éléments de type T.
  3. TryPop (out T) - cette méthode est utilisée pour récupérer le premier élément de la pile. Il renvoie vrai en cas de succès, faux dans le cas contraire.
  4. TryPeek (out T) - cette méthode est utilisée pour récupérer l'élément suivant de la pile mais elle ne supprime pas l'élément de la pile. Notez que similaire à la méthode TryPop (out T), elle renvoie true en cas de succès et false dans le cas contraire.
  5. TryPopRange - cette méthode est surchargée et fonctionne de la même manière que TryPop mais est utilisée pour récupérer les tableaux de la pile

Voici comment vous pouvez créer une instance de la classe ConcurrentStack et y envoyer des données.

ConcurrentStack concurrentStack = new ConcurrentStack();

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

{

       concurrentStack.Push(index);

}

Pour récupérer les éléments à partir d'une pile simultanée, vous pouvez tirer parti de la méthode TryPop (out T) comme indiqué ci-dessous.

Int32 data;

bool success = concurrentStack.TryPop(out data);

La liste de codes suivante illustre comment vous pouvez stocker et récupérer des données vers et depuis une pile simultanée.

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

       }

Lorsque vous exécutez la liste de codes ci-dessus, les nombres de 0 à 99 seront affichés dans l'ordre inverse dans la fenêtre de la console.

ConcurrentQueue

Une file d'attente est une structure de données qui fonctionne sur la base de FIFO (premier entré, premier sorti). La classe ConcurrentQueue dans .Net agit comme une file d'attente générique basée sur FIFO thread-safe.

Voici la liste des méthodes importantes de la classe ConcurrentQueue.

  1. Enqueue (élément T) - cette méthode est utilisée pour ajouter un élément de type T à la file d'attente
  2. TryPeek (out T) - cette méthode est utilisée pour récupérer l'élément suivant de la file d'attente mais elle ne supprime pas l'élément de la file d'attente. Cette méthode renvoie true en cas de succès et false en cas d'échec.
  3. TryDequeue (out T) - cette méthode est utilisée pour récupérer le premier élément de la file d'attente. Contrairement à la méthode TryPeek (out T), elle supprime l'élément de la file d'attente. Cette méthode renvoie true en cas de succès et false dans le cas contraire.

L'extrait de code suivant montre comment vous pouvez créer une instance de la classe ConcurrentQueue pour stocker des entiers.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

Pour stocker des éléments dans l'instance de file d'attente simultanée, vous pouvez tirer parti de la méthode Enqueue comme indiqué ci-dessous.

concurrentQueue.Enqueue(100);

La liste de codes suivante montre comment stocker et récupérer des éléments vers et depuis une file d'attente simultanée.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

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

{

     concurrentQueue.Enqueue(index);

}

Int32 item;

while (concurrentQueue.TryDequeue(out item))

{

     Console.WriteLine(item);

}

Lorsque vous exécutez la liste de codes ci-dessus, les nombres de 0 à 99 seront affichés dans la fenêtre de la console.

Notez que les classes ConcurrentStack et ConcurrentQueue sont thread-safe et peuvent gérer les problèmes de verrouillage et de synchronisation en interne.

Vous pouvez également convertir l'instance de file d'attente simultanée en tableau en appelant la méthode ToArray (). L'extrait de code suivant illustre comment cela peut être réalisé.

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

}

La propriété IsEmpty de la classe ConcurrentQueue renvoie true si la collection est vide, false dans le cas contraire. L'extrait de code suivant montre comment vous pouvez utiliser cette méthode.

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

}