Я работал над функцией, которая ставит в очередь трудоемкую работу в канале, и там я перебираю канал, используя, например,
await foreach(var item in channel.Reader.ReadAllAsync(cancellationToken)) {...}
Я ожидал, что когда отмена запрашивается через этот cancelToken, ReadAllAsync выдаст первую итерацию, следующую за отменой.
Мне кажется, это не так. Цикл продолжается до тех пор, пока все элементы не будут обработаны, а затем затем выдается исключение OperationCanceledException.
Это выглядит, по меньшей мере, немного странно. Из репозитория ChannelReader на github можно увидеть, что токен отмены помечен атрибутом [EnumeratorCancellation], поэтому его следует передать в конечный автомат, сгенерированный вокруг элемента возврата доходности; (поправьте меня, если я ошибаюсь).
Мой вопрос: это (в некоторой степени) нормальное поведение ReadAllAsync(CancellationToken) , или я что-то упустил?
Вот простой тестовый код, демонстрирующий проблему (попробуйте его на dotnetfiddle):
var channel = Channel.CreateUnbounded();
for (int i = 1; i 4 && !cts.IsCancellationRequested)
{
Console.WriteLine("Cancelling...");
cts.Cancel();
}
}
}
catch (OperationCanceledException)
{
Console.WriteLine($"Operation cancelled. Items read: {itemsRead}");
}
Вот результат вышеизложенного. Обратите внимание, как продолжается получение элемента после того, как оно должно было быть отменено в середине:
Read item: 1. Requested cancellation: False
Read item: 2. Requested cancellation: False
Read item: 3. Requested cancellation: False
Read item: 4. Requested cancellation: False
Read item: 5. Requested cancellation: False
Cancelling...
Read item: 6. Requested cancellation: True
Read item: 7. Requested cancellation: True
Read item: 8. Requested cancellation: True
Read item: 9. Requested cancellation: True
Read item: 10. Requested cancellation: True
Operation cancelled. Items read: 10
Подробнее здесь: https://stackoverflow.com/questions/675 ... id-iterati
ChannelReader.ReadAllAsync(CancellationToken) фактически не отменен в середине итерации ⇐ C#
Место общения программистов C#
1727283492
Anonymous
Я работал над функцией, которая ставит в очередь трудоемкую работу в канале, и там я перебираю канал, используя, например,
await foreach(var item in channel.Reader.ReadAllAsync(cancellationToken)) {...}
Я ожидал, что когда отмена запрашивается через этот cancelToken, ReadAllAsync выдаст первую итерацию, следующую за отменой.
Мне кажется, это не так. Цикл продолжается до тех пор, пока все элементы не будут обработаны, а затем [b]затем[/b] выдается исключение OperationCanceledException.
Это выглядит, по меньшей мере, немного странно. Из репозитория ChannelReader на github можно увидеть, что токен отмены помечен атрибутом [EnumeratorCancellation], поэтому его следует передать в конечный автомат, сгенерированный вокруг элемента возврата доходности; (поправьте меня, если я ошибаюсь).
[b]Мой вопрос:[/b] это (в некоторой степени) нормальное поведение ReadAllAsync(CancellationToken) , или я что-то упустил?
Вот простой тестовый код, демонстрирующий проблему (попробуйте его на dotnetfiddle):
var channel = Channel.CreateUnbounded();
for (int i = 1; i 4 && !cts.IsCancellationRequested)
{
Console.WriteLine("Cancelling...");
cts.Cancel();
}
}
}
catch (OperationCanceledException)
{
Console.WriteLine($"Operation cancelled. Items read: {itemsRead}");
}
Вот результат вышеизложенного. Обратите внимание, как продолжается получение элемента после того, как оно должно было быть отменено в середине:
Read item: 1. Requested cancellation: False
Read item: 2. Requested cancellation: False
Read item: 3. Requested cancellation: False
Read item: 4. Requested cancellation: False
Read item: 5. Requested cancellation: False
Cancelling...
Read item: 6. Requested cancellation: True
Read item: 7. Requested cancellation: True
Read item: 8. Requested cancellation: True
Read item: 9. Requested cancellation: True
Read item: 10. Requested cancellation: True
Operation cancelled. Items read: 10
Подробнее здесь: [url]https://stackoverflow.com/questions/67569758/channelreader-readallasynccancellationtoken-not-actually-cancelled-mid-iterati[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия