System.Threading.Channels statt eigener Queue

System.Threading.Channels statt eigener Queue

- Matt

Für ein Erzeuger-Verbraucher-Muster habe ich früher BlockingCollection genommen, was blockierend ist und mit async nicht zusammenpasst.

var kanal = Channel.CreateBounded<Auftrag>(new BoundedChannelOptions(100)
{
    FullMode = BoundedChannelFullMode.Wait
});

await kanal.Writer.WriteAsync(auftrag, token);

await foreach (var a in kanal.Reader.ReadAllAsync(token))
    await Verarbeite(a);

CreateBounded ist der wichtige Teil. Ein unbegrenzter Kanal wächst, bis der Speicher voll ist, wenn der Verbraucher langsamer ist als der Erzeuger. Mit Grenze wartet der Schreiber, und der Rückstau wird zum Merkmal statt zum Absturz.