Существует ли класс C#, например Queue, который реализует IAsyncEnumerable?

И то и другое Queue а также ConcurrentQueue осуществлять IEnumerable но нет IAsyncEnumerable. Есть ли в NuGet стандартный класс или класс, реализующийIAsyncEnumerable так что, если очередь пуста, результат MoveNextAsync не завершается до тех пор, пока в очередь не будет добавлено следующее?

1 ответ

Решение

Если вы используете платформу.NET Core, есть как минимум два встроенных варианта:

  1. В System.Threading.Tasks.Dataflow.BufferBlock<T> класс, часть библиотеки TPL Dataflow. Он не реализуетIAsyncEnumerable<T> изначально, но он обнажает ожидаемые OutputAvailableAsync() метод, делая его тривиальным для реализации ToAsyncEnumerable метод расширения.

  2. В 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, но легко реализовать аналогичным образом)

Другие вопросы по тегам