Pipeline

Variante con System.Threading.Channels para procesamiento concurrente y back-pressure.

#Cuándo usarla

Cuando los pasos son lentos y conviene paralelizarlos con back-pressure natural.

using System.Threading.Channels;

var inputs = Channel.CreateBounded<string>(100);
var processed = Channel.CreateBounded<byte[]>(100);

// Stage 1
_ = Task.Run(async () =>
{
    await foreach (var s in inputs.Reader.ReadAllAsync())
        await processed.Writer.WriteAsync(SHA256.HashData(Encoding.UTF8.GetBytes(s.Trim())));
    processed.Writer.Complete();
});

// Producer
await inputs.Writer.WriteAsync("hola");
inputs.Writer.Complete();

// Consumer
await foreach (var hash in processed.Reader.ReadAllAsync())
    Console.WriteLine(Convert.ToHexString(hash));
Tradeoffs
Pro Contra
Throughput alto, back-pressure incluido Más complejo: lifecycle de canales y cancelación

#pipeline #channels #async