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

请说明 C# 中协程与 async/await 异步方法在底层分别基于哪些机制实现,二者在设计目标和执行模型上有何本质差异?

技术原理方案权衡C#

考察说明

考查对 C# 协程和异步方法底层实现原理及差异的理解。

回答思路

  1. 【回答框架 1】C# 协程通常指基于迭代器(yield return)实现的状态机,编译器将方法转换为实现 IEnumerable/IEnumerator 的类,内部维护状态字段和当前执行位置,MoveNext 每次推进到下一个 yield,从而实现暂停和恢复。
  2. 【回答框架 2】async/await 异步方法同样是编译器生成状态机,但用于非阻塞等待,状态机保存 await 上下文,当等待的 Task 完成时通过回调或同步上下文恢复执行,底层依赖线程池或 IO 完成端口等异步机制。
  3. 【回答框架 3】本质差异在于协程主要用于代码段的分步执行(可视为协作式调度),不涉及底层 IO 异步化;async/await 专注于解决 IO/耗时操作不占用线程,提供异步编程模型,底层由运行时调度。
  4. 【回答框架 4】两者虽都借助状态机,但目标不同:协程是用户态执行流切换,async/await 是异步操作完成后的回调调度。实现上 async 状态机更复杂,涉及 SynchronizationContext 和异常传播。
  5. 【关键点 1】C# 协程通过 yield 和迭代器状态机实现暂停/恢复。
  6. 【关键点 2】async/await 编译器生成状态机,配合 Task 和异步 IO 完成非阻塞等待。
  7. 【关键点 3】二者底层都是状态机,但协程侧重分步执行,async/await 侧重异步非阻塞。
  8. 【关键点 4】async 状态机涉及同步上下文和线程调度,协程不涉及。
  9. 【易错点 1】混淆协程与 async 的线程模型,协程不一定异步。
  10. 【易错点 2】误认为 async 方法一定在线程池新线程执行。
  11. 【易错点 3】忽略 async 状态机在 UI 线程的 SynchronizationContext 调度风险。