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) 有什么区别 的相关文章

  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何在.NET Core上直接调用F#编译器?

    UPD 我想直接从 NET Core SDK 调用 F 编译器 即 fsc 我了解 dotnet build co 但当我只需要编译一个简单的问题时 即 fsc file fs 就足够的情况下 我不想涉及它们 我尝试在 NET Core S
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 如何在离子模拟器中观看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