有什么像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> 。 如果您只有一个用户,则可以使用OutputAvailableAsyncReceiveAsync ,或者将其链接到一个ActionBlock<T> 。 欲了解更多信息, 请参阅我的博客 。

另外两个是我创build的types,可以在我的AsyncEx库中find 。

AsyncCollection<T>BlockingCollection<T>近似等同async ,能够包装ConcurrentQueue<T>ConcurrentBag<T>等并发生产者/消费者集合。 您可以使用TakeAsyncasynchronous使用集合中的项目。 欲了解更多信息, 请参阅我的博客 。

AsyncProducerConsumerQueue<T>是一个更便携的async兼容的生产者/消费者队列。 您可以使用DequeueAsyncasynchronous消耗队列中的项目。 欲了解更多信息, 请参阅我的博客 。

所有这三个select允许同步和asynchronous的投入和采取。