using System.Threading.Channels;
using System.Threading.Tasks;
var channel = Channel.CreateUnbounded<int>();
for (int i = 1; i <= 10; i++) channel.Writer.TryWrite(i);
var cts = new CancellationTokenSource();
await foreach (var i in channel.Reader.ReadAllAsync(cts.Token))
Console.WriteLine($"Read item: {i}. Requested cancellation: " +
$"{cts.Token.IsCancellationRequested}");
if (++itemsRead > 4 && !cts.IsCancellationRequested)
Console.WriteLine("Cancelling...");
catch (OperationCanceledException)
Console.WriteLine($"Operation cancelled. Items read: {itemsRead}");