Skip to content

Consumir un Channel con AsyncEnumerableResult ​

Channel.Reader.ReadAllAsync() ya es una secuencia asíncrona. El resultado puede envolverla mientras otro procedimiento publica.

csharp
using System.Threading.Channels;
using Greencore.Platform.Results;

var canal = Channel.CreateBounded<int>(2);
using var detener = new CancellationTokenSource();
await using var resultado = AsyncEnumerableResult<int>.Ok(canal.Reader.ReadAllAsync());
var productor = ProducirAsync(canal.Writer, detener.Token);
try
{
    await foreach (var numero in resultado)
        Console.WriteLine(numero);
}
finally
{
    await detener.CancelAsync();
    await productor;
}

static async Task ProducirAsync(ChannelWriter<int> writer, CancellationToken token)
{
    try
    {
        for (var numero = 1; numero <= 3; numero++)
            await writer.WriteAsync(numero, token);
        writer.TryComplete();
    }
    catch (OperationCanceledException) when (token.IsCancellationRequested)
    {
        writer.TryComplete();
    }
    catch (Exception exception)
    {
        writer.TryComplete(exception);
    }
}

El productor se inicia antes de consumir y se espera al final. Con capacidad limitada, esperar al productor antes de empezar a leer podría dejarlo bloqueado por falta de espacio.

Disponer el resultado no completa el escritor ni detiene al productor: el finally coordina ese trabajo. En este ejemplo, cancelar al productor termina el canal normalmente; otros fallos se comunican por la lectura.

Recuerda: el resultado administra enumeradores; tú administras el productor independiente.

Uso personal limitado. Uso comercial sujeto a autorización escrita.