【发布时间】:2019-05-23 04:25:03
【问题描述】:
C# 8 增加了对异步迭代器块的支持,因此您可以等待并返回 IAsyncEnumarator 而不是 IEnumerable:
public async IAsyncEnumerable<int> EnumerateAsync() {
for (int i = 0; i < 10; i++) {
yield return i;
await Task.Delay(1000);
}
}
使用如下所示的非阻塞消费代码:
await foreach (var item in EnumerateAsync()) {
Console.WriteLine(item);
}
这将导致我的代码运行大约 10 秒。但是,有时我想在所有元素被消耗之前突破await foreach。但是,使用break,我们需要等到当前等待的Task.Delay 完成。 我们如何在不等待任何悬空异步任务的情况下立即跳出循环?
【问题讨论】:
-
你是说
yield break;在异步枚举中不起作用? -
yield break将按预期工作,但在等待Task.Delay时您将无法中断。 -
如何取消任何可取消的操作,包括Task.Delay,与
IAsyncEnumerable无关。这不是悬空任务,同样httpClient.GetStringAsync不是悬空任务 -
当我在消费者端使用
break退出foreach时,默认情况下不会取消等待的任务。
标签: c# c#-8.0 iasyncenumerable