Как насчет создания собственной параллельной коллекции с помощью .NET? В этой статье мы рассмотрим, как создать параллельную коллекцию с помощью интерфейса IPProducerConsumerCollection.

Интерфейс IProducerConsumerCollection содержит методы, которые позволяют обрабатывать потокобезопасные коллекции. Этот интерфейс находится в пространстве имен System.Collections.Concurrent.

В приведенном ниже коде представлен простой способ создания поточно-ориентированной очереди с помощью IProducerConsumerCollection. Обратите внимание, что для управления параллелизмом в коллекции Queue код использует оператор lock в операциях.

В приведенном выше коде четыре метода являются частью IProducerConsumerCollection:

  • CopyTo: копирует элементы из коллекции в существующий массив.
  • ToArray: копирует элементы из коллекции в новый массив.
  • TryTake: пытается взять и удалить элемент из коллекции.
  • TryAdd: пытается добавить новый элемент в коллекцию.

Остальные методы в коде относятся к интерфейсу ICollectionи IEnumerable, присутствующему в IProducerConsumerCollection.

Теперь, когда у нас есть поточно-ориентированная очередь (MySafeQueue), давайте посмотрим, как с ней работать. Код ниже имитирует заказы, которые отправляются потребителю:

В коде есть две задачи, которые будут выполняться в разных потоках. Первый — это producerTask, который отвечает за создание и добавление новых заказов в коллекцию MySafeQueue.

Вторая задача — consumerTask. Эта задача берет и удаляет Заказы из коллекции MySafeQueue и представляет их пользователю. Обратите внимание, что эта задача проверит коллекцию, когда CancellationToken не будет отменен.

Наконец, через метод Task.WaitAll будут запущены все задачи, и это будет завершено через 2 секунды, когда CancellationToken получит сигнал для быть отменен.

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

Ссылка: