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