有什么像asynchronousBlockingCollection <T>?
我想await
BlockingCollection<T>.Take()
asynchronous,所以我不阻塞线程。 寻找像这样的东西:
var item = await blockingCollection.TakeAsync();
我知道我可以这样做:
var item = await Task.Run(() => blockingCollection.Take());
但是这有点杀死了整个想法,因为ThreadPool
另一个线程被阻塞了。
有没有其他的select?
我知道有三种select。
第一个是来自TPL Dataflow的 BufferBlock<T>
。 如果您只有一个用户,则可以使用OutputAvailableAsync
或ReceiveAsync
,或者将其链接到一个ActionBlock<T>
。 欲了解更多信息, 请参阅我的博客 。
另外两个是我创build的types,可以在我的AsyncEx库中find 。
AsyncCollection<T>
是BlockingCollection<T>
近似等同async
,能够包装ConcurrentQueue<T>
或ConcurrentBag<T>
等并发生产者/消费者集合。 您可以使用TakeAsync
asynchronous使用集合中的项目。 欲了解更多信息, 请参阅我的博客 。
AsyncProducerConsumerQueue<T>
是一个更便携的async
兼容的生产者/消费者队列。 您可以使用DequeueAsync
asynchronous消耗队列中的项目。 欲了解更多信息, 请参阅我的博客 。
所有这三个select允许同步和asynchronous的投入和采取。