По всем вопросам- @notxxx1
Реестр РКН: https://clck.ru/3Fk3kb
#VRHSZ
Post #1883
1.29K
🧩 Задача на C#: почему воркер завис, хотя очередь почти пустая?
Есть канал вместимостью один элемент и единственный обработчик. Если задача завершилась ошибкой, обработчик возвращает её в очередь для повторной попытки.
Вопросы:
1. Что появится в консоли?
2. На какой строке остановится обработка?
3. Почему
4. Если увеличить вместимость канала до двух, проблема исчезнет?
5. Как организовать не больше трёх попыток на задачу, сохранив ограниченную очередь и одного обработчика?
Условие: нельзя использовать
👇 Найдите причину зависания и предложите исправление.
Есть канал вместимостью один элемент и единственный обработчик. Если задача завершилась ошибкой, обработчик возвращает её в очередь для повторной попытки.
using System.Threading.Channels;
var queue = Channel.CreateBounded<int>(
new BoundedChannelOptions(1)
{
FullMode = BoundedChannelFullMode.Wait,
SingleReader = true
});
await queue.Writer.WriteAsync(1);
var worker = Task.Run(async () =>
{
await foreach (var job in queue.Reader.ReadAllAsync())
{
Console.WriteLine($"Start {job}");
if (job == 1)
{
await queue.Writer.WriteAsync(2);
await queue.Writer.WriteAsync(1); // retry
}
Console.WriteLine($"Done {job}");
}
});
await worker;
Вопросы:
1. Что появится в консоли?
2. На какой строке остановится обработка?
3. Почему
await и свободные потоки пула не спасают?4. Если увеличить вместимость канала до двух, проблема исчезнет?
5. Как организовать не больше трёх попыток на задачу, сохранив ограниченную очередь и одного обработчика?
Условие: нельзя использовать
Task.Run для каждой повторной попытки, неограниченную очередь или отбрасывание сообщений.👇 Найдите причину зависания и предложите исправление.











