capypad
0 Tage Serie
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
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();
});
 
// Consumer
await 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.