Task.WhenAll() 和 foreach(任务中的 var task) 有什么区别

2024-02-10

经过几个小时的努力,我在我的应用程序中发现了一个错误。我认为下面的两个函数具有相同的行为,但事实证明它们并非如此。

谁能告诉我幕后到底发生了什么,以及为什么他们的行为方式不同?

public async Task MyFunction1(IEnumerable<Task> tasks){
    await Task.WhenAll(tasks);

    Console.WriteLine("all done"); // happens AFTER all tasks are finished
}

public async Task MyFunction2(IEnumerable<Task> tasks){
    foreach(var task in tasks){
        await task;
    }

    Console.WriteLine("all done"); // happens BEFORE all tasks are finished
}

它们的功能相同如果所有任务成功完成.

如果你使用WhenAll并且任何项目失败,在所有项目完成之前它仍然不会完成,并且它将代表一个AggregatException包裹着all错误来自all tasks.

If you await每一个一旦命中就会完成any失败的项目,它将代表一个例外one错误,而不是任何其他错误。


两者的区别还在于WhenAll将会具体化整个IEnumerable就在开始时,在向其他项目添加任何延续之前。如果IEnumerable表示已经存在和已启动的任务的集合,那么这是不相关的,但是如果迭代可枚举的行为创建和/或启动任务,那么在开始时具体化序列将并行运行它们,并在之前等待每个任务获取下一个任务将按顺序执行它们。下面是一个IEnumerable你可以传入它的行为,就像我在这里描述的那样:

public static IEnumerable<Task> TaskGeneratorSequence()
{
    for(int i = 0; i < 10; i++)
        yield return Task.Delay(TimeSpan.FromSeconds(2);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Task.WhenAll() 和 foreach(任务中的 var task) 有什么区别 的相关文章

随机推荐

  • 如何在离子模拟器中观看console.logs?

    我正在使用以下方式构建一个应用程序离子框架 http ionicframework com 到目前为止我已经在浏览器中完成了 因为我现在想使用cordovaOauth 插件 https github com nraboy ng cordov
  • React Native 选择器未在 Android 中显示

    我正在尝试在 React Native Android 中添加选择器 但它没有在 Android 中显示 我将我的位置日期映射到选择器项目 但我在屏幕上没有看到选择器
  • mySQL 查询在数据库中的所有表中搜索字符串?

    是否有一个 mySQL 查询来搜索数据库中的所有表 如果没有 您可以从 mySQL 工作台 GUI 搜索数据库中的所有表吗 phpmyadmin 有一个搜索面板 您可以使用选择所有表来搜索 我发现这非常有效 因为我正在使用的电子商务包 ma
  • 如何在本地打开经典 ASP 网站并在 Visual Studio 中附加到它?

    也许我还没有找到合适的帖子 但我一直无法为 ASP 网站设置调试 该网站正在我们的服务器上运行 但我被告知要在本地附加到它 不幸的是 我不知道如何做到这一点 我在源代码管理中有该网站的本地副本 可以在 Visual Studio 中打开它
  • 在存储库中添加 .gitconfig 会覆盖我的全局 .gitconfig 文件配置吗?

    我的项目托管在 TFS GIT 服务器中 我在 TFS 上合并拉取请求时遇到问题 一种选择是更新 TFS 服务器本身上的 git 配置以进行 合并 no ff 因为时间紧迫和其他无法尽快完成的问题 我正在寻找解决此问题的方法 如果我将 gi
  • 如何在选择文本时触发事件,例如启动应用程序

    我想知道当在浏览器 消息等任何应用程序中选择文本时是否可以启动活动或应用程序 就像当我们在任何地方选择一个文本时 会出现一个小弹出窗口 提到剪切 复制 粘贴选项 我可以在那里添加另一个按钮吗 启动我的应用程序 如果可以 请指导我如何做到这一
  • 如何告诉 gzip_static 不寻找图像文件?

    我安装了 nginx 并激活了 gzip static 它适用于 CSS 和 JavaScript 文件 但它也会查找图像文件的 gzip 压缩版本 例如 png 和 gif 尽管这些文件不在要压缩的文件列表中 strace p 25044
  • 如何在 Flutter 中创建圆形 CheckBox?或者改变CheckBox的样式,比如Flutter中选中的图片?

    我想创建一个像这样的圆形复选框 我尝试过多种变体 但似乎都不起作用 包括我尝试使用 ClipRRect 由于代码较多 这里只选取部分展示 new Row children
  • 使用Spring注入EntityManager(空指针异常)[重复]

    这个问题在这里已经有答案了 这是我的 ApplicationContext xml 中的代码
  • 实体框架迁移错误 - 序列不包含元素

    command 添加迁移等等 详细 error 序列不包含元素 在出现此错误之前我做了一些事情 我对代码优先模型进行了更改 但没有运行add migration然而 然后我添加了一个 EDMX 模型来直观地发挥一个想法 我意识到 EDMX
  • Vue JS 3:如何将数据从一个组件传递到另一个组件?

    我正在尝试共享存储在变量中的数据favorite count在收藏夹组件中Favorites vue文件 我想与应用程序组件共享该数据App vue文件 但我无法 我希望如果我改变的值favorite count在收藏夹组件中 它在应用程序
  • OpenERP 6.1中创建菜单项时访问规则禁止的操作

    当我尝试创建新的菜单项以在 OpenERP 6 1 中打开窗口时 出现以下错误 访问错误 访问规则禁止的操作 或对已删除的文档执行的操作 操作 创建 文档类型 ir values 我总是可以使用绕过所有安全检查的神奇管理员帐户 但如果可能的
  • Java 小程序 --> ClassNotFound 异常

    我正在学习Java并阅读这本书 在本书中 我有一个Java applet 练习 我可以在 Eclipse 的 appletviewer 中运行它并且运行良好 但我在将小程序集成到 HTML 中时遇到问题 这是我的java代码 package
  • 如何在 Decision Manager 中导出和导入本地项目?

    我正在使用红帽决策管理器 我已经完成了我的项目 我想将其部署到另一台电脑上 我所能得到的只是一个 jar 文件 但是当我导入它时 决策管理器响应 未找到项目 希望有任何帮助 Thanks 从 Red Hat Decision Manager
  • 在类模板实例化中显式使用某些参数的默认值

    一个类模板可以有多个参数 这些参数都有默认值 template
  • 绘制两个 xts 对象

    我在用着xtsExtra绘制两个 xts 对象 考虑以下对plot xts的调用 plot xts merge a b screens c 1 2 它用于在两个单独的面板中绘制 xts 对象 a 和 b 如何控制 y 轴的间距 具体来说 我
  • 安卓蓝牙连接错误

    我在堆栈跟踪中收到以下消息 我可以找到蓝牙设备 但是当我尝试打开套接字时会发生这种情况 10 30 22 23 08 901 ERROR BTL CFG 8633 WARNING service brcm bt INQ FILTER BDA
  • 以 DirectX 编程方式创建纹理

    我试图通过提供 rgba 值数组 使用该数组创建 ID3D11Texture2D 资源 然后将其映射到我的 20 x 20 正方形 在屏幕上创建一个白色 20 x 20 像素正方形 以下是创建方形纹理和着色器资源视图的代码 void Squ
  • Intel Core 2 Duo 预取

    有人有过在 Core 2 Duo 处理器上使用预取指令的经验吗 我一直在使用 标准 预取集 prefetchnta prefetcht1等 在一系列 P4 机器上取得了成功 但是当在 Core 2 Duo 上运行代码时 似乎prefetch
  • Task.WhenAll() 和 foreach(任务中的 var task) 有什么区别

    经过几个小时的努力 我在我的应用程序中发现了一个错误 我认为下面的两个函数具有相同的行为 但事实证明它们并非如此 谁能告诉我幕后到底发生了什么 以及为什么他们的行为方式不同 public async Task MyFunction1 IEn