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

请说明 C# 异步编程的实现机制,并解释 async 与 await 两个关键字各自承担的功能角色。

技术原理C#

考察说明

考查对 C# 异步编程模型及 async/await 语法糖背后原理的理解。

回答思路

  1. 【回答框架 1】C# 异步编程基于 Task 和 Task<T> 模型,通过线程池调度实现非阻塞等待。async 关键字用于标记方法为异步,允许方法内部使用 await;await 关键字则挂起当前方法,将后续代码注册为回调,在等待的 Task 完成时继续执行。
  2. 【回答框架 2】实现核心是状态机:编译器将 async 方法转换为状态机结构,在遇到 await 时保存当前执行上下文并返回,线程不再阻塞;Task 完成时通过 SynchronizationContext(如 UI 线程)或线程池线程恢复执行,实现异步不阻塞。
  3. 【回答框架 3】async 关键字本身不创建新线程,仅开启异步模式;await 是对 Task 的等待,会释放当前线程。两者的结合使得编写异步代码像同步代码一样直观,同时避免线程阻塞。
  4. 【回答框架 4】注意事项:async 方法应避免长时间 CPU 密集型操作,否则会占用线程池线程;异常处理需在 await 处捕获,Task 的异常会被包装为 AggregateException,但 await 会自动解包为原始异常。
  5. 【关键点 1】async 标记方法启用异步,但不创建新线程。
  6. 【关键点 2】await 挂起方法,释放当前线程,Task 完成后恢复执行。
  7. 【关键点 3】实现基于编译器生成的状态机和线程池调度。
  8. 【关键点 4】UI 场景下 await 默认捕获并恢复 SynchronizationContext,保证 UI 线程访问。