Работа с колекции, безопасни за нишки: ConcurrentStack и ConcurrentQueue

Безопасните нишки колекции бяха въведени за първи път в .Net 4 с въвеждането на пространството от имена System.Collections.Concurrent. Типовете колекции в пространството от имена System.Collections.Concurrent съдържа колекция от класове за безопасно събиране на нишки.

ConcurrentStack

Стекът е структура от данни, която работи на база LIFO (последно влизане първо). Класът ConcurrentStack е безопасен за нишки аналог на общия клас Stack. ConcurrentStack е общ клас за събиране на нишки, който е представен за първи път като част от .Net Framework 4. Ето списъка на важните методи от този клас, които илюстрират възможните операции.

  1. Push (T елемент) - този метод се използва за добавяне на данни от тип T.
  2. PushRange - този метод може да се използва за добавяне на масив от елементи от тип Т.
  3. TryPop (out T) - този метод се използва за извличане на първия елемент от стека. Връща истината при успех, фалшивата в противен случай
  4. TryPeek (out T) - този метод се използва за извличане на следващия елемент от стека, но не премахва елемента от стека. Имайте предвид, че подобно на метода TryPop (out T), той връща true при успех и false в противен случай.
  5. TryPopRange - този метод е претоварен и работи подобно на TryPop, но се използва за извличане на масиви от стека

Ето как можете да създадете екземпляр на класа ConcurrentStack и да изпратите данни към него.

ConcurrentStack concurrentStack = new ConcurrentStack();

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

{

       concurrentStack.Push(index);

}

За да извлечете елементите от едновременен стек, можете да използвате метода TryPop (out T), както е показано по-долу.

Int32 data;

bool success = concurrentStack.TryPop(out data);

Следният списък с кодове илюстрира как можете да съхранявате и извличате данни към и от едновременен стек.

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

       }

Когато изпълните горния списък с кодове, числата от 0 до 99 ще се показват в обратен ред в прозореца на конзолата.

ConcurrentQueue

Опашката е структура от данни, която работи на базата на FIFO (първо в първото излизане). Класът ConcurrentQueue в .Net действа като обща опашка, базирана на нишки, базирана на FIFO.

По-долу е списъкът на важните методи в класа ConcurrentQueue.

  1. Enqueue (T елемент) - този метод се използва за добавяне на елемент от тип T към опашката
  2. TryPeek (out T) - този метод се използва за извличане на следващия елемент от опашката, но не премахва елемента от опашката. Този метод връща true при успех и false при неуспех.
  3. TryDequeue (out T) - този метод се използва за извличане на първия елемент от опашката. Противно на метода TryPeek (out T), той премахва елемента от опашката. Този метод връща true при успех и false в противен случай.

Следният кодов фрагмент показва как можете да създадете екземпляр на класа ConcurrentQueue за съхраняване на цели числа.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

За да съхранявате елементи в едновременния екземпляр на опашката, можете да се възползвате от метода Enqueue, както е показано по-долу.

concurrentQueue.Enqueue(100);

Следният списък с кодове илюстрира как можете да съхранявате и извличате елементи към и от едновременна опашка.

ConcurrentQueue concurrentQueue = new ConcurrentQueue();

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

{

     concurrentQueue.Enqueue(index);

}

Int32 item;

while (concurrentQueue.TryDequeue(out item))

{

     Console.WriteLine(item);

}

Когато изпълните горния списък с кодове, числата от 0 до 99 ще се покажат в прозореца на конзолата.

Обърнете внимание, че класовете ConcurrentStack и ConcurrentQueue са безопасни за нишки и могат да управляват вътрешно проблеми със заключване и синхронизация.

Можете също да конвертирате екземпляра на едновременната опашка в масив, като направите извикване на метода ToArray (). Следният кодов фрагмент илюстрира как това може да се постигне.

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

}

Свойството IsEmpty на класа ConcurrentQueue връща true е колекцията е празна, в противен случай е false. Следният кодов фрагмент показва как можете да използвате този метод.

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

}