csharp / expert
Snippet
Hochleistungs-Streaming mit System.Threading.Channels
System.Threading.Channels bietet eine hochoptimierte, asynchrone Producer-Consumer-Queue. Im Gegensatz zu ConcurrentQueue unterstützt es nativ async/await beim Warten auf Platz (Writer) oder Elemente (Reader). Bounded Channels ermöglichen Backpressure-Management, sodass ein schneller Producer den Arbeitsspeicher nicht überlastet, wenn der Consumer langsam ist.
snippet.csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System.Threading.Channels;var channel = Channel.CreateBounded<int>(new BoundedChannelOptions(100) {FullMode = BoundedChannelFullMode.Wait});// Producer_ = Task.Run(async () => {for (int i = 0; i < 1000; i++)await channel.Writer.WriteAsync(i);channel.Writer.Complete();});// Consumerawait foreach (var item in channel.Reader.ReadAllAsync()) {Process(item);}
Erklärung
1
Channel.CreateBounded<int>(100)
Erstellt eine threadsichere Queue mit einer festen Kapazität von 100 Elementen.
2
await channel.Writer.WriteAsync(i)
Wartet asynchron, falls der Channel voll ist, bevor das Element hinzugefügt wird.
3
channel.Reader.ReadAllAsync()
Gibt ein IAsyncEnumerable zurück, das Elemente liefert, sobald sie verfügbar sind, bis der Channel geschlossen wird.