Как насчет создания собственной параллельной коллекции с помощью .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 получит сигнал для быть отменен.
Я надеюсь, что это может быть полезно для вас! УДАЧНОГО ПРОГРАММИРОВАНИЯ!!
Ссылка: