Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
new TItemQueue() в сторону защищенного конструктора. Просто потому что может понадобиться передать в конструктор внутренней коллекции несколько параметров. Тот факт, что с внутренней коллекцией теоретически смогут работать без нашего ведома — не страшен, надо просто запретить такую работу в документации, а кто так сделает — тот сам себе злобный буратино. В конце концов, это можно будет сделать только тому, кто явно наследуется от AsyncCollection — а наследуясь от библиотечного класса надо всегда понимать, что ты делаешь._awaiterQueue лучше хранить обобщенный делегат вида bool ItemConsumer<TItem>(TItem value). Это позволит очень просто реализовать операцию TakeFromAny.Я бы все-таки отказался от new TItemQueue() в сторону защищенного конструктора.
Вместо TaskCompletionSource в _awaiterQueue лучше хранить обобщенный делегат вида bool ItemConsumer<TItem&rt;(TItem value). Это позволит очень просто реализовать операцию TakeFromAny.
Не быстрее BlockingCollection — возможно, внутри она и есть.HellBrick.AsyncCollections.AsyncQueue : 13ms Nito.AsyncEx.AsyncCollection : 363ms System.Concurrent.BlockingCollection : 23ms System.Threading.Tasks.Dataflow.BufferBlock : 22ms
Если происходит вызов Add(), у нас появляется новый элемент, с помощью которого можно мгновенно взять один из awaiter-ов и завершить его.
AsyncCollections: история одного велосипеда