Asynccollections: История Одного Велосипеда

Я долгое время был большим поклонником System.Collections.Concurrent и BlockingCollection, в частности.

Я не могу сосчитать, сколько раз это чудо техники выручало в самых разных ситуациях.

С несколько менее древних времен async/await прочно вошёл в употребление.

Казалось бы, жизнь прекрасна, но есть одно «но»: смешивать асинхронный код с блокирующим кодом как-то не очень хочется.

А BlockingCollection, как можно догадаться (по крайней мере, из названия), в некоторых случаях блокирует поток.



Ложный след: Nito.AsyncEx

Однажды я наткнулся на ссылку на библиотеку Нито.

AsyncEx Стивена Клири, в котором был класс с интригующим названием AsyncCollection. Однако, взглянув на то, что было под капотом, я остался в некотором недоумении: там был AsyncLock из той же библиотеки, прикрепленный ко всем действиям над обернутой IProducerConsumerCollection. AsyncLock, в свою очередь, активно использует самые обычные блокировки и тонкий слой магии, разгадывать который мне вдруг не захотелось.

Даже если эта реализация и делает то, что заявлена, она выглядит немного надуманной, чудовищной и, возможно, не очень оптимальной.

Неужели нельзя точнее решить эту задачу? Мы все знаем последствия таких мыслей.

Visual Studio, Новый проект…

Асинккуеу

Для начала давайте определимся, чего мы вообще хотим от нашей асинхронной коллекции.

В качестве отправной точки можно взять следующий интерфейс: Теги: #C++ #.

NET #async #await #асинхронные коллекции #interlocked #dependent #memorybarrier #magic #.

NET #C++ #Параллельное программирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.