问题描述
Queue
和ConcurrentQueue
都实现IEnumerable
,但不实现IAsyncEnumerable
.在NuGet上是否有一个实现IAsyncEnumerable
的标准类或标准类,如果队列为空,则MoveNextAsync
的结果要等到下一个添加到队列后才能完成?
Both Queue
and ConcurrentQueue
implement IEnumerable
but not IAsyncEnumerable
. Is there a standard class or class available on NuGet which implements IAsyncEnumerable
such that, if the queue is empty, the result of MoveNextAsync
does not complete until something next is added to the queue?
推荐答案
如果使用的是.NET Core平台,则至少有两个内置选项:
If you are using the .NET Core platform there are at least two built-in options:
-
System.Threading.Tasks.Dataflow.BufferBlock<T>
类,是 TPL数据流的一部分图书馆.它不是本机实现IAsyncEnumerable<T>
,而是公开了可等待的OutputAvailableAsync()
方法,这对于实现ToAsyncEnumerable
扩展方法来说是微不足道的.
The
System.Threading.Tasks.Dataflow.BufferBlock<T>
class, part of the TPL Dataflow library. It doesn't implement theIAsyncEnumerable<T>
natively, but it exposes the awaitableOutputAvailableAsync()
method, doing it trivial to implement aToAsyncEnumerable
extension method.
System.Threading.Channels.Channel<T>
类,它是 Channels 库的核心组件.它通过其公开一个IAsyncEnumerable<T>
实现. Reader.ReadAllAsync()
¹方法.
The System.Threading.Channels.Channel<T>
class, the core component of the Channels library. It exposes an IAsyncEnumerable<T>
implementation via itsReader.ReadAllAsync()
¹ method.
通过安装nuget包(每个包都不同),这两个类也可用于.NET Framework.
Both classes are also available for .NET Framework, by installing a nuget package (different for each one).
BufferBlock<T>
的IAsyncEnumerable<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;
}
}
await source.Completion.ConfigureAwait(false); // Propagate possible exception
}
¹(不适用于.NET Framework,但易于在类似的方法)
¹ (not available for .NET Framework, but easy to implement in a similar way)
这篇关于是否有像Queue这样的C#类实现IAsyncEnumerable?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!