You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:10:20