ChannelReader.ReadAllAsync(CancellationToken) фактически не отменен в середине итерацииC#

Место общения программистов C#
Ответить
Anonymous
 ChannelReader.ReadAllAsync(CancellationToken) фактически не отменен в середине итерации

Сообщение Anonymous »

Я работал над функцией, которая ставит в очередь трудоемкую работу в канале, и там я перебираю канал, используя, например,
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»