Отмена асинхронного итератора в C#
Метод WithCancellation передаёт токен в перебор. Отмена не обрывает поток насильно: на следующем шаге перечисление останавливается само.
При отмене MoveNextAsync бросает OperationCanceledException.
Прервём длинный перебор коротким таймером. Успевшие числа могут появиться в консоли, а после отмены туда попадёт "end":
static async IAsyncEnumerable<int> ManyAsync()
{
for (int i = 0; i < 100; i++)
{
await Task.Delay(1);
yield return i;
}
}
using CancellationTokenSource cts = new();
cts.CancelAfter(2);
try
{
await foreach (int v in ManyAsync().WithCancellation(cts.Token))
{
Console.WriteLine(v);
}
}
catch (OperationCanceledException)
{
Console.WriteLine("end");
}
Сделайте бесконечную последовательность чисел, прервите перебор отменой и выведите 1, когда перебор остановится.