Apariencia
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.