Bounded канал в C#
Метод Channel.CreateBounded задаёт максимальную ёмкость очереди. WriteAsync ждёт, пока читатель не освободит место, если буфер полон - так производитель не обгоняет потребителя без ограничений.
Пока мест в буфере нет, писатель ждёт читателя. В примере особый режим переполнения не задаётся: запись просто ждёт свободный слот. Результат записи проверяют один раз до ожидания. После await этот статус уже забран, повторно читать его нельзя.
Ёмкость 2: две записи проходят сразу, третья ещё не завершена, пока буфер полон. Первая строка в консоли - 1, это признак незавершённой записи. Затем читают 1 и 2:
using System.Threading.Channels;
Channel<int> ch = Channel.CreateBounded<int>(2);
await ch.Writer.WriteAsync(1);
await ch.Writer.WriteAsync(2);
ValueTask writeThird = ch.Writer.WriteAsync(3);
Console.WriteLine(writeThird.IsCompleted ? 0 : 1); // выведет 1
Console.WriteLine(await ch.Reader.ReadAsync()); // выведет 1
await writeThird;
Console.WriteLine(await ch.Reader.ReadAsync()); // выведет 2
Создайте канал целых чисел ёмкостью 1. Запишите число 4, затем начните запись числа 8 и не ждите её. Выведите 1, если вторая запись ещё не завершилась. Потом прочитайте первое число и дождитесь второй записи.