C#面试题更新 2026-08-03

请描述在 C# 中利用异步流与 IAsyncEnumerable 接口的方法,并说明其使用场景?

考察说明

考查对 C# 异步流及 IAsyncEnumerable 接口的理解与应用能力。

回答思路

  1. 【回答框架 1】IAsyncEnumerable 是 C# 8.0 引入的接口,用于异步生成和消费序列数据。它允许在迭代过程中异步等待,避免阻塞线程。
  2. 【回答框架 2】定义:一个支持异步迭代的集合接口,通过 IAsyncEnumerator 提供 MoveNextAsync 方法,返回 ValueTask<bool> 以支持异步等待。
  3. 【回答框架 3】使用场景包括:处理流式数据(如日志、传感器数据)、异步分页查询、以及任何需要逐步获取大量数据且每个步骤都可能涉及 I/O 操作的场景。
  4. 【回答框架 4】实现方式:可以在方法中通过 yield return 配合 await 生成异步流,例如使用 async 迭代器方法。消费时使用 await foreach 语句。
  5. 【回答框架 5】注意事项:异步流是拉取模型,消费速度影响生产速度;需要正确处理取消与异常;与同步 IEnumerable 的区别在于每次迭代都可能异步等待。
  6. 【关键点 1】IAsyncEnumerable 支持异步迭代,MoveNextAsync 返回 ValueTask<bool>。
  7. 【关键点 2】通过 async 迭代器方法(yield return)生成异步流。
  8. 【关键点 3】消费时使用 await foreach,可配合 CancellationToken 取消。
  9. 【关键点 4】适用于任何涉及异步 I/O 的序列数据场景。
  10. 【关键点 5】每次迭代都可能异步,与同步 IEnumerable 不同。
  11. 【易错点 1】不要将异步流用于所有序列,仅当每一步迭代都涉及异步操作时使用。
  12. 【易错点 2】忽略取消令牌可能导致资源泄漏或操作挂起。
  13. 【易错点 3】异步流是拉取模型,消费慢可能导致生产者阻塞,需考虑背压。