IAsyncEnumerable<T> 解决的是一个很现实的问题:
我不想等“全部取完”才开始处理,我想边拿边算。
典型场景:
public async IAsyncEnumerable<int> GetNumbersAsync(
[System.Runtime.CompilerServices.EnumeratorCancellation] CancellationToken ct = default)
{
for (var i = 0; i < 10; i++)
{
ct.ThrowIfCancellationRequested();
await Task.Delay(50, ct);
yield return i;
}
}
await foreach (var n in GetNumbersAsync(ct))
{
Console.WriteLine(n);
}
忘了取消:流式处理通常是长任务,务必把 CancellationToken 一路传下去。
误以为并发:await foreach 默认是串行消费;需要并发要自己做 Channel / Task.WhenAll + 限流。
资源释放:如果你的迭代器内部打开连接/流,确保在迭代结束时能正确释放(await using / try/finally)。