Как мы можем безопасно работать с коллекциями с помощью параллельного программирования на C#? В этой серии статей давайте посмотрим, что .NET предлагает в виде потокобезопасных коллекций.

Если вы хотите работать с коллекцией в многозадачных приложениях, взгляните на пространство имен System.Collections.Concurrent. Это пространство имен содержит соответствующие типы из пространств имен System.Collections и System.Collections.Generic.

В этой первой части давайте посмотрим, как использовать класс ConcurrentQueue. Так же, как и класс Queue, объекты ConcurrentQueue позволяют нам работать в режиме «первым пришел, первым обслужен» с разные нити.

В приведенном ниже коде представлен простой способ реализации ConcurrentQueue:

По сути, приведенный выше код суммирует все числа внутри объекта параллельной очереди. Здесь есть два важных метода для обработки ConcurrentQueue:

  • Поставить в очередь: добавляет новый объект в конец очереди.
  • TryDequeue: пытается удалить и вернуть объект очереди.

Обратите внимание, что сумма всех чисел была сделана для разных потоков в цикле Parallel.For.

Теперь, если вы хотите использовать простой объект Queue в многозадачном приложении, вам нужно будет побеспокоиться об устранении проблемы состояния гонки .

В приведенном ниже коде мы используем объект Monitor для обработки параллелизма при попытке удалить все элементы из очереди:

Я надеюсь, что это может быть полезно для вас! УДАЧНОГО ПРОГРАММИРОВАНИЯ!!

Ссылка: