C#
Beginner
1 min read
Async Streams and Channels
Example
// Async streams with IAsyncEnumerable<T> and Channels
using System.Threading.Channels;
// --- Async stream producer ---
static async IAsyncEnumerable<int> GenerateNumbersAsync(
int count,
[System.Runtime.CompilerServices.EnumeratorCancellation]
CancellationToken ct = default)
{
for (int i = 0; i < count; i++)
{
await Task.Delay(50, ct).ConfigureAwait(false);
yield return i * i;
}
}
// Consumer using await foreach
await foreach (int square in GenerateNumbersAsync(8).WithCancellation(CancellationToken.None))
Console.Write($"{square} ");
Console.WriteLine();
// --- Channels: bounded producer-consumer ---
var channel = Channel.CreateBounded<string>(capacity: 5);
async Task ProduceAsync(ChannelWriter<string> writer)
{
for (int i = 0; i < 10; i++)
{
await writer.WriteAsync($"message-{i}");
await Task.Delay(20);
}
writer.Complete();
}
async Task ConsumeAsync(ChannelReader<string> reader)
{
await foreach (string msg in reader.ReadAllAsync())
Console.WriteLine($"[Consumer] received: {msg}");
}
await Task.WhenAll(
ProduceAsync(channel.Writer),
ConsumeAsync(channel.Reader));