Is there a C# class like Queue that implements IAsyncEnumerable?(是否有像 Queue 这样实现 IAsyncEnumerable 的 C# 类?)
问题描述
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 aToAsyncEnumerableextension 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# 类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:是否有像 Queue 这样实现 IAsyncEnumerable 的 C# 类?
基础教程推荐
- 如何使用 .Net 检查 Active Directory 服务器是否已启动并正在运行? 2022-01-01
- C# 从 List<List<int>> 中删除重 2022-01-01
- Moq It.Is<>不匹配 2022-01-01
- 如果有人提交恶意软件Nuget包怎么办? 2022-01-01
- .NET SerialPort DataReceived 事件未触发 2022-01-01
- 我应该在后面的代码中直接使用 Linq To SQL 还是使 2022-01-01
- WPF 模态进度窗口 2022-01-01
- 禁止输入少量字符,例如'<'、'&a 2022-01-01
- Azure Functions:CosmosDBTrigger 未在 Visual Studio 中触发 2022-01-01
- 当值可以是对象或空数组时反序列化 JSON 2022-01-01
