TGViewer
C# 1001 notes C# 1001 notes @csharp_1001_notes · 6.64K subscribers
Post #911 590
🧩 C# Channels: сообщение попало в очередь. Почему обработчик его не получил?

Два воркера читают один ограниченный канал. Один из них отменяет ожидание. Продюсер успешно записывает сообщение — без исключений.


using System.Threading.Channels;

var queue = Channel.CreateBounded<int>(
new BoundedChannelOptions(1)
{
FullMode = BoundedChannelFullMode.Wait
});

using var cts = new CancellationTokenSource();

var firstRead = queue.Reader.ReadAsync().AsTask();

var firstWorker = Task.Run(async () =>
{
try
{
var item = await firstRead.WaitAsync(cts.Token);
Console.WriteLine($"A: {item}");
}
catch (OperationCanceledException)
{
Console.WriteLine("A: canceled");
}
});

// Дожидаемся, чтобы первый воркер обработал отмену.
cts.Cancel();
await firstWorker;

var secondWorker = Task.Run(async () =>
{
await foreach (var item in queue.Reader.ReadAllAsync())
Console.WriteLine($"B: {item}");
});

await queue.Writer.WriteAsync(42);
queue.Writer.TryComplete();

await secondWorker;
await queue.Reader.Completion;

Console.WriteLine("Finished");


Разберите без запуска:

1. Что выведет программа? Возможны ли разные результаты?
2. Где окажется 42, если ни один воркер его не напечатает?
3. Почему Reader.Completion успешно завершится?
4. Чем отличаются эти две записи?


reader.ReadAsync().AsTask().WaitAsync(token)
reader.ReadAsync(token).AsTask()


Усложнение: отмена и запись происходят одновременно. Достаточно ли второй записи, чтобы гарантировать, что сообщение не потеряется?

Предложите протокол остановки: после извлечения сообщение должно быть обработано либо явно сохранено для повторной попытки. Очередь остаётся ограниченной, обработчики могут завершаться с ошибкой.

👇 В какой момент ответственность за сообщение переходит от канала к воркеру?
More from @csharp_1001_notes
  1. Sep 16, 2026Эта задача проверяет понимание Memory<T>, pooling, ownership, IAsyncEnumerable, cancellati…
  2. Sep 16, 2026# C# 14: хитрая задача на ArrayPool, IAsyncEnumerable и время жизни памяти Есть поток данн…
  3. Sep 14, 2026# C# 14: конкурентный кеш без race condition Реализуйте потокобезопасный кеш: public seale…
  4. Sep 14, 2026🔍Тестовое собеседование с Senior C# разработчиком уже завтра 15 сентября(уже завтра!) в 1…
  5. Sep 11, 2026🔧 Как передать многострочный PEM через Aspire в ASP.NET Core Сертификаты и ключи в PEM со…
  6. Sep 10, 2026Согласны ?
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →