有什么像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>等并发生产者/消费者集合。 您可以使用TakeAsyncasynchronous使用集合中的项目。 欲了解更多信息, 请参阅我的博客 。
AsyncProducerConsumerQueue<T>是一个更便携的async兼容的生产者/消费者队列。 您可以使用DequeueAsyncasynchronous消耗队列中的项目。 欲了解更多信息, 请参阅我的博客 。
所有这三个select允许同步和asynchronous的投入和采取。