Существует ли класс C#, например Queue, который реализует IAsyncEnumerable?
И то и другое Queue
а также ConcurrentQueue
осуществлять IEnumerable
но нет IAsyncEnumerable
. Есть ли в NuGet стандартный класс или класс, реализующийIAsyncEnumerable
так что, если очередь пуста, результат MoveNextAsync
не завершается до тех пор, пока в очередь не будет добавлено следующее?
1 ответ
Если вы используете платформу.NET Core, есть как минимум два встроенных варианта:
В
System.Threading.Tasks.Dataflow.BufferBlock<T>
класс, часть библиотеки TPL Dataflow. Он не реализуетIAsyncEnumerable<T>
изначально, но он обнажает ожидаемыеOutputAvailableAsync()
метод, делая его тривиальным для реализацииToAsyncEnumerable
метод расширения.В
System.Threading.Channels.Channel<T>
класс, основной компонент библиотеки каналов. Это обнажаетIAsyncEnumerable<T>
реализация черезReader.ReadAllAsync()
¹ метод.
Оба класса также доступны для.NET Framework путем установки пакета nuget (для каждого отдельного).
Реализация IAsyncEnumerable<T>
за 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;
}
}
await source.Completion.ConfigureAwait(false); // Propagate possible exception
}
¹ (недоступно для.NET Framework, но легко реализовать аналогичным образом)