两者都Queue
和ConcurrentQueue
实施IEnumerable
但不是IAsyncEnumerable
。NuGet 上是否有可用的标准类或类实现IAsyncEnumerable
这样,如果队列为空,MoveNextAsync
直到将下一个内容添加到队列中,结果才会完成?
问问题
920 次
1 回答
5
如果您使用的是 .NET Core 平台,则至少有两个内置选项:
该类
System.Threading.Tasks.Dataflow.BufferBlock<T>
是TPL 数据流库的一部分。它本身没有实现IAsyncEnumerable<T>
,但它公开了可等待的OutputAvailableAsync()
方法,实现ToAsyncEnumerable
扩展方法很简单。System.Threading.Channels.Channel<T>
类,Channels库的核心组件。IAsyncEnumerable<T>
它通过其Reader.ReadAllAsync()
¹ 方法公开了一个实现。
通过安装 nuget 包(每个类都不同),这两个类也可用于 .NET Framework。
IAsyncEnumerable<T>
for的实现BufferBlock<T>
:
public static async IAsyncEnumerable<T> ToAsyncEnumerable<T>(
this IReceivableSourceBlock<T> source,
[EnumeratorCancellation]CancellationToken cancellationToken = default)
{
while (await source.OutputAvailableAsync(cancellationToken).ConfigureAwait(false))
{
while (source.TryReceive(out T item))
{
yield return item;
cancellationToken.ThrowIfCancellationRequested();
}
}
await source.Completion.ConfigureAwait(false); // Propagate possible exception
}
¹(不适用于 .NET Framework,但易于以类似方式实现)
于 2019-11-05T08:53:37.273 回答