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

在C#中,Task.WhenAll和Task.WhenAny各自适用于哪些实际场景?请结合并发控制、任务完成条件等角度,说明两者的典型用途及选择依据。

技术原理方案权衡C#

考察说明

考查对C#异步任务组合器(Task.WhenAll与Task.WhenAny)的理解,以及在不同并发场景下的选择能力。

回答思路

  1. 【回答框架 1】Task.WhenAll用于等待所有任务完成,常用于需要聚合多个异步操作结果的场景,如并行请求多个接口后统一处理,或等待多个独立计算完成。它返回一个任务,该任务在所有输入任务全部完成时完成,若任一任务失败,则返回的任务将转为故障状态。
  2. 【回答框架 2】Task.WhenAny用于等待任一任务完成,常用于竞态条件或需要尽快获取第一个结果的场景,如超时控制(与其他任务竞争)、请求多个服务取最快响应、或提前退出等待。它返回一个任务,该任务在任一输入任务完成时便完成,并携带该完成的任务。
  3. 【回答框架 3】实际选择依据:若必须全部成功后才能继续,或需聚合所有结果,用WhenAll;若只需第一个成功或最快返回,或用于实现超时/取消逻辑,用WhenAny。注意WhenAll的异常聚合,WhenAny需额外判断完成的任务是成功还是失败。
  4. 【回答框架 4】两者可结合使用,例如使用WhenAny实现超时:将主任务与延迟任务组合,当延迟任务先完成时表明超时,再配合取消令牌实现取消。也可用WhenAll并行处理多个任务,并在其中一个失败时通过WhenAny提前响应。
  5. 【关键点 1】WhenAll等待所有任务完成,适用于聚合多个并行异步操作的结果。
  6. 【关键点 2】WhenAny等待任一任务完成,适用于竞速场景、超时控制或快速返回首个结果。
  7. 【关键点 3】WhenAll会聚合异常,任一任务失败则结果任务失败;WhenAny返回首完成的任务,需检查其状态。
  8. 【关键点 4】可组合使用WhenAny与延迟任务实现超时逻辑。
  9. 【易错点 1】误用WhenAny仅判断完成而忽略成功与否,可能拿到的却是失败任务的结果。
  10. 【易错点 2】使用WhenAll时未处理个别任务异常,导致整个任务快速失败,掩盖后续执行。
  11. 【易错点 3】将WhenAny当作等待所有,导致后续任务未完成即继续,引发竞态错误。