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

请阐述在 .NET 平台下,如何借助 Task 类以及 async/await 语法来编写异步代码?

编码实现风险判断技术原理C#.NET

考察说明

考查对 .NET 异步编程模型(Task、async/await)的理解以及实际运用能力。

回答思路

  1. 【回答框架 1】Task 表示一个异步操作,它可能返回一个值(Task<TResult>)或不返回值(Task)。async 关键字用于修饰方法,使其可以包含 await 表达式;await 用于等待一个 Task 完成,并暂停当前方法的执行,但不阻塞调用线程。
  2. 【回答框架 2】async/await 是基于状态机的机制:编译器将 async 方法重写为状态机,当遇到 await 时,如果任务尚未完成,则记录当前状态并返回,控制权交还给调用者;任务完成后,通过同步上下文或线程池恢复执行,从而实现非阻塞的异步操作。
  3. 【回答框架 3】使用 async 方法时,应遵循命名约定(以 Async 结尾),并避免在方法内部直接调用 .Result 或 .Wait(),因为这可能导致死锁或阻塞线程。应使用 await 来获取结果,并正确处理异常和取消。
  4. 【回答框架 4】在 ASP.NET 等同步上下文中,要特别注意上下文捕获问题,避免死锁;可用 ConfigureAwait(false) 避免捕获上下文,提高性能。
  5. 【关键点 1】async 修饰方法,await 等待 Task 完成,不阻塞线程。
  6. 【关键点 2】编译器将 async 方法转换为状态机,实现异步流程。
  7. 【关键点 3】避免使用 .Result 或 .Wait() 同步阻塞,防止死锁。
  8. 【关键点 4】使用 ConfigureAwait(false) 可减少上下文切换。
  9. 【关键点 5】异步方法应返回 Task 或 Task<T>,并遵循 Async 后缀命名。
  10. 【易错点 1】在同步上下文中使用 .Result 或 .Wait() 可能导致死锁。
  11. 【易错点 2】忘记使用 await 会得到未观察到的异常,且方法可能提前返回。
  12. 【易错点 3】过度使用 async/await 可能导致性能开销,若操作是快速计算的,同步更合适。