Как мы можем безопасно работать с коллекциями с помощью параллельного программирования на C#? В этой серии статей давайте посмотрим, что .NET предлагает в виде потокобезопасных коллекций.
Если вы хотите работать с коллекцией в многозадачных приложениях, взгляните на пространство имен System.Collections.Concurrent. Это пространство имен содержит соответствующие типы из пространств имен System.Collections и System.Collections.Generic.
В этой первой части давайте посмотрим, как использовать класс ConcurrentQueue. Так же, как и класс Queue, объекты ConcurrentQueue позволяют нам работать в режиме «первым пришел, первым обслужен» с разные нити.
В приведенном ниже коде представлен простой способ реализации ConcurrentQueue:
По сути, приведенный выше код суммирует все числа внутри объекта параллельной очереди. Здесь есть два важных метода для обработки ConcurrentQueue:
- Поставить в очередь: добавляет новый объект в конец очереди.
- TryDequeue: пытается удалить и вернуть объект очереди.
Обратите внимание, что сумма всех чисел была сделана для разных потоков в цикле Parallel.For.
Теперь, если вы хотите использовать простой объект Queue в многозадачном приложении, вам нужно будет побеспокоиться об устранении проблемы состояния гонки .
В приведенном ниже коде мы используем объект Monitor для обработки параллелизма при попытке удалить все элементы из очереди:
Я надеюсь, что это может быть полезно для вас! УДАЧНОГО ПРОГРАММИРОВАНИЯ!!
Ссылка: