我想把结果await上的BlockingCollection<T>.Take()异步,所以我不发挡路的帖子.正在查找类似以下内容的内容:

var item = await blockingCollection.TakeAsync();

我知道我可以做到:

var item = await Task.Run(() => blockingCollection.Take());

但这有点扼杀了整个 idea ,因为另一个线程(ThreadPool个)被阻塞了.

还有别的 Select 吗?

推荐答案

我知道有四种 Select .

第一个是Channels,它提供了一个支持异步ReadWrite操作的线程安全队列.通道经过高度优化,如果达到阈值,可以 Select 删除一些项目.

下一个是TPL DataflowBufferBlock<T>.如果你只有一个消费者,你可以使用OutputAvailableAsyncReceiveAsync,或者只是将其链接到ActionBlock<T>.欲了解更多信息,请点击see my blog.

最后两个是我创建的类型,在我的AsyncEx library中提供.

AsyncCollection<T> is the async near-equivalent of BlockingCollection<T>, capable of wrapping a concurrent producer/consumer collection such as ConcurrentQueue<T> or ConcurrentBag<T>. You can use TakeAsync to asynchronously consume items from the collection. For more information, see my blog.

AsyncProducerConsumerQueue<T> is a more portable async-compatible producer/consumer queue. You can use DequeueAsync to asynchronously consume items from the queue. For more information, see my blog.

这些备选方案中的最后三个允许同步和异步放置和获取.

.net相关问答推荐

为什么$NULL在ForEach-Object{}和Foreach()中的行为不同?

Docker镜像mcr.microsoft.com/dotnet/aspnet:8.0不能在Windows上构建

AutoMapper在实体框架查询后不知从哪里带来数据

如何运行大量阻塞/同步 I/O 操作

单线程单元 - 无法实例化 ActiveX 控件

在 ASP.NET MVC 中我可以在哪里放置自定义类?

如何让 DateTimePicker 显示一个空字符串?

Silverlight 与 Flex

C# 方法可以定义为采用的最大参数数是多少?

创建多个线程并等待所有线程完成

如何在 C# 中安全地将 System.Object 转换为bool?

mscorlib 代表什么?

C# (.NET) 设计缺陷

确定使用 ContextMenuStrip 的控件

如何使用通用扩展方法中的字符串列名在 IQueryable 上应用 OrderBy?

如何在 C# 中处理 XML

在 Windows 窗体 C# 应用程序中拥有配置文件的最简单方法

如何卸载Microsoft .NET Core 1.0.0 RC2 - VS 2015 Tooling Preview 1?

您可以将 Microsoft Entity Framework 与 Oracle 一起使用吗?

从不同程序集中的类名中解析类型