Jul*_*rch 3 c# queue asynchronous iasyncenumerable
两者Queue和ConcurrentQueue实施IEnumerable但不是IAsyncEnumerable。NuGet 上是否有可用的标准类或类来实现IAsyncEnumerable,如果队列为空,则在将MoveNextAsync下一个添加到队列之前,结果不会完成?
如果您使用 .NET Core 平台,则至少有两个内置选项:
在System.Threading.Tasks.Dataflow.BufferBlock<T>课堂上,部分TPL数据流库。它没有实现本IAsyncEnumerable<T>机,但它公开了可等待的OutputAvailableAsync()方法,实现ToAsyncEnumerable扩展方法很简单。
在System.Threading.Channels.Channel<T>课堂上,核心部件通道库。它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
}
Run Code Online (Sandbox Code Playgroud)
¹(不适用于 .NET Framework,但易于以类似方式实现)