是否有像 Queue 这样实现 IAsyncEnumerable 的 C# 类?

Is there a C# class like Queue that implements IAsyncEnumerable?(是否有像 Queue 这样实现 IAsyncEnumerable 的 C# 类?)
本文介绍了是否有像 Queue 这样实现 IAsyncEnumerable 的 C# 类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

QueueConcurrentQueue 都实现 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:

  1. System.Threading.Tasks.Dataflow.BufferBlock<T> 类,TPL 数据流 库.它没有原生实现 IAsyncEnumerable<T>,但它公开了可等待的 OutputAvailableAsync() 方法,实现 ToAsyncEnumerable 很简单扩展方法.

  1. The System.Threading.Tasks.Dataflow.BufferBlock<T> class, part of the TPL Dataflow library. It doesn't implement the IAsyncEnumerable<T> natively, but it exposes the awaitable OutputAvailableAsync() method, doing it trivial to implement a ToAsyncEnumerable extension method.

System.Threading.Channels.Channel<T> 类,频道 库.它通过其公开 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 its Reader.ReadAllAsync()¹ method.

通过安装 nuget 包(每个类不同),这两个类也可用于 .NET Framework.

Both classes are also available for .NET Framework, by installing a nuget package (different for each one).

BufferBlockIAsyncEnumerable 实现:

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,但易于在 类似方式)

¹ (not available for .NET Framework, but easy to implement in a similar way)

这篇关于是否有像 Queue 这样实现 IAsyncEnumerable 的 C# 类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)