IAsyncEnumerable用于异步逐项枚举数据,适用于处理网络、文件或数据库中的大数据流,避免阻塞线程。典型场景包括分批查询数据库、读取HTTP流、处理大文件及实现SSE推送模式。通过async方法结合yield return可生成异步流,编译器自动管理状态机。

IAsyncEnumerable
什么时候用 IAsyncEnumerable?
当你需要按需、异步地产生或消费一系列数据时,IAsyncEnumerable 就非常有用。典型场景包括:
- 从 HTTP 流中逐条读取日志或事件
- 分批查询数据库并实时返回结果
- 处理大型文件或数据流,避免一次性加载到内存
- 实现服务器发送事件(SSE)或 WebSocket 类似的推送模式
如何生成异步数据流?
使用 yield return 和 async IAsyncEnumerable
如何消费异步数据流?
使用 await foreach 来安全地遍历 IAsyncEnumerable,它会自动处理每个元素的异步等待。
await foreach (var number in GenerateNumbers()) { Console.WriteLine(number); }这会每 100 毫秒输出一个数字,不会阻塞主线程。
实际应用中的注意事项
处理异步流时要注意资源管理和异常处理:
- 确保异步流正确释放资源(如文件句柄、网络连接),可结合 IAsyncDisposable 使用
- 在 yield return 前的异步调用可能抛出异常,应在生成方法内部适当 try-catch
- 消费者也应考虑超时或取消机制,可通过 CancellationToken 传入
例如支持取消:
public async IAsyncEnumerable基本上就这些。IAsyncEnumerable 让你在处理数据流时既能保持响应性,又能写出清晰的代码。不复杂但容易忽略的是:记得用 await foreach,别当成普通集合直接遍历。










