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

在 C# 编程中,当需要同时等待多个异步操作全部完成时,应该如何利用 await 关键字来实现?请描述具体的语法和使用方式。

编码实现技术原理C#

考察说明

考查对 C# 异步编程中 await 关键字的理解,尤其是如何等待多个异步任务完成。

回答思路

  1. 【回答框架 1】在 C# 中,await 关键字用于等待一个可等待对象(如 Task 或 Task<T>)异步完成。若要等待多个异步操作,常见做法是使用 Task.WhenAll 方法,它接受一系列任务,并返回一个在所有任务完成后完成的任务。
  2. 【回答框架 2】例如,如果有两个异步方法 Task<int> GetDataAsync() 和 Task<string> GetMessageAsync(),可以调用 Task.WhenAll(GetDataAsync(), GetMessageAsync()) 来同时启动它们,并使用 await 等待所有任务完成。
  3. 【回答框架 3】除了 WhenAll,还有 Task.WhenAny 可以等待任意一个任务完成,适用于需要最先完成的场景。此外,还可以使用 await foreach 处理异步流,但对于多个独立任务的并行等待,WhenAll 是最直接的方法。
  4. 【回答框架 4】使用 WhenAll 时,如果其中一个任务抛出异常,WhenAll 返回的任务最终会失败,但所有任务都会执行完。可以通过捕获异常并检查每个任务的异常信息来处理。
  5. 【回答框架 5】另一种方式是手动使用 Task.WaitAll(同步阻塞),但 await WhenAll 更符合异步非阻塞模型,避免阻塞调用线程,提高资源利用率。
  6. 【关键点 1】Task.WhenAll 用于等待所有任务完成,且不阻塞线程。
  7. 【关键点 2】Task.WhenAny 用于等待任意任务完成。
  8. 【关键点 3】WhenAll 会等待所有任务结束,即使其中某些任务失败。
  9. 【易错点 1】不要对单个任务使用多个 await 试图并行,应使用 WhenAll 或 WhenAny。
  10. 【易错点 2】WhenAll 并非一定并行执行,取决于任务是否已启动;若任务是热的(已运行),则并行。
  11. 【易错点 3】异常处理复杂,需逐个检查任务异常。