#c_sharp #многопоточность #коллекции #очередь
Применение BlockingCollection, используя подход, когда элементы вытаскиваются из очереди(например ConcurrentQueue), используя метод Take в цикле - всегда блокирует поток. Очевидно, что процессорное время не занимается, однако поток все же занят и не может использоваться для выполнения других задач. Какая есть альтернатива, когда нужно последовательно вычитывать элементы из очереди и при этом не блокировать поток? Конечно, можно сделать велосипед, накрутить событий или чего-нибудь еще, но хотелось бы понять, нет ли каких-либо стандартных способов это сделать, кроме как использовать BlockingCollection и метод Take. P.S. Есть метод TryTake, но я не могу найти решение с его использованием, эквивалентное использованию Take и при этом неблокирующее поток.
Ответы
Ответ 1
Вам на самом деле нужен класс BufferBlockиз библиотеки Dataflow (nuget-пакет Microsoft.Tpl.Dataflow). Этот класс заменяет собой BlockingCollection , и позволяет асинхронный доступ: await queue.ReceiveAsync() Таким образом, поток не будет заблокирован. Но у вас получится async-интерфейс. Больше примеров с работающим кодом есть в этом ответе. Ещё одним вариантом является async-обёртка над IProducerCosumerCollection из AsyncEx Стивена Клири: https://github.com/StephenCleary/AsyncEx/wiki/AsyncCollection
Комментариев нет:
Отправить комментарий