请说明在 C# 中,async 和 await 关键字是如何协同工作以实现异步编程的?
考察说明
考查对 C# 异步编程模型(async/await)核心机制和用法的理解。
回答思路
- 【回答框架 1】async 修饰方法使其可包含 await 表达式,await 用于挂起方法执行,直到等待的任务完成。async 方法返回类型通常为 Task 或 Task<T>,void 仅用于事件处理器。
- 【回答框架 2】编译器将 async 方法转换为状态机,await 处暂存状态并返回控制权给调用者,线程可继续执行其他工作。任务完成时通过同步上下文(如 UI 线程)恢复后续代码执行。
- 【回答框架 3】异步编程适用于 I/O 密集操作,如网络请求、文件读写,避免阻塞线程;CPU 密集计算应使用 Task.Run 或并行编程,而不是 async/await。
- 【回答框架 4】需注意异常处理和取消支持:async 方法中的异常存入返回的任务,可通过 await 捕获;配合 CancellationToken 实现协作式取消。
- 【关键点 1】async 方法中至少有一个 await 表达式,否则编译器会给出警告。
- 【关键点 2】await 不阻塞调用线程,而是异步等待操作完成。
- 【关键点 3】async/await 是编译时特性,不创建新线程,只是更高效地利用现有线程。
- 【易错点 1】在 UI 线程中错误使用 .Result 或 .Wait() 可能导致死锁。
- 【易错点 2】async void 方法不能由调用者捕获异常,应尽量避免。
- 【易错点 3】若仅用 async/await 包装 CPU 密集型代码,不会提升性能,反而增加开销。