Task.WhenAll(taskList).Wait()和Task.WaitAll(taskList)是否等效?
两行代码行为对比解答
这两行代码的运行行为、AggregateException异常处理逻辑绝大多数场景下一致,仅在参数校验、入参支持范围上存在明确差异,具体说明如下:
一致点
- 都是同步阻塞当前线程,直到
taskList中所有任务执行完毕(无论任务最终是成功、抛出未处理异常还是被取消) - 当入参合法、所有任务正常进入执行流程时,两者抛出的
AggregateException结构完全相同:所有任务的未处理异常都会被压平存入AggregateException.InnerExceptions集合,不会出现嵌套的AggregateException,该场景下的异常处理逻辑可以完全通用。
差异点
- 入参支持范围不同(编译层面差异)
Task.WaitAll仅接受Task[]数组类型的入参,如果你的taskList是List<Task>等非数组的可枚举集合,Task.WaitAll(taskList)会直接编译报错;Task.WhenAll同时支持IEnumerable<Task>和数组类型的入参,适用范围更广。 - 参数校验的异常抛出逻辑不同
Task.WaitAll是同步方法,调用瞬间就会做参数校验:如果taskList本身为null、或者内部包含null元素,会直接抛出普通的ArgumentNullException等参数异常,不会包装进AggregateException,也不会等待任何任务执行。Task.WhenAll是异步方法,参数校验不通过时会直接返回一个状态为已失败的Task,等你调用Wait()时才会把参数异常包装进AggregateException中抛出。
内容的提问来源于stack exchange,提问作者To Wa
相关产品推荐
相关产品推荐

