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