调用Delegate的Invoke时任务如何构建?是否隐式执行Task.WhenAll?
多播Task委托Invoke行为解析
代码示例
delegate Task MyDelegate(); event MyDelegate d; d += () => Task.Delay(100); d += () => Task.Delay(200); d += () => Task.Delay(300); var t = d.Invoke(); await Task.Delay(1000);
观察到的现象
调用Invoke后,返回的任务状态为:
Id = 1, Status = WaitingForActivation, Method = {null}
延迟1000毫秒(所有子任务完成后),任务状态变为:
Id = 1, Status = RanToCompletion, Method = {null}
问题解答
这不是隐式执行Task.WhenAll,而是多播委托针对返回Task类型的专属处理逻辑:
- 当多播委托里包含多个返回
Task的成员时,Invoke会按顺序执行每个委托项,收集所有返回的Task,然后返回一个包装任务。 - 这个包装任务会等待所有子任务完成,但和
Task.WhenAll有细节差异:如果子任务抛出异常,包装任务不会立刻终止,要等所有子任务都执行完毕后,才抛出包含全部异常的AggregateException;而Task.WhenAll在第一个异常出现时就会进入故障状态(不过最终也会等待所有任务执行完成)。 - 你观察到的包装任务拥有独立
Id、所有子任务完成后才变为RanToCompletion的状态,正是这个机制的直接表现。
内容的提问来源于stack exchange,提问作者Xeo
相关产品推荐
相关产品推荐

