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

请解释 C# 中 Task 类的主要用途,并说明利用它实现异步操作的基本方法。

编码实现技术原理问题排查C#

考察说明

考查对 C# Task 模型及异步编程基础的理解与应用能力。

回答思路

  1. 【回答框架 1】Task 表示一个异步操作的单元,可携带返回值(Task<TResult>)或仅表示完成状态(Task)。它比 Thread 更轻量,通过线程池和调度器高效利用资源,避免了频繁创建线程的开销。
  2. 【回答框架 2】使用 async/await 是操作 Task 的常用方式:将方法标记为 async,内部使用 await 等待 Task 完成,期间不阻塞调用线程。编译器会生成状态机来管理异步流程。
  3. 【回答框架 3】也可以通过显式创建 Task,如 Task.Run 将同步工作放入线程池并返回 Task;还可以用 Task.WhenAll/Task.WhenAny 组合多个异步操作。
  4. 【回答框架 4】处理异常:异步方法中的未观察异常会进入 Task 状态,等待 await 或 Task.Wait 时抛出。使用 WhenAll 时需使用 AggregateException 处理多个异常。
  5. 【关键点 1】Task 代表异步操作,Task<TResult> 有返回值。
  6. 【关键点 2】async/await 实现非阻塞等待,不占用调用线程。
  7. 【关键点 3】Task.Run 将 CPU 密集型工作卸载到线程池。
  8. 【关键点 4】Task.WhenAll 并发等待多个任务完成。
  9. 【易错点 1】避免在 UI 线程上使用 Task.Result/.Wait() 导致死锁。
  10. 【易错点 2】async void 仅用于事件处理器,否则异常难以捕获。
  11. 【易错点 3】CPU 密集型操作使用 Task.Run 需谨慎,可能增加上下文切换开销。