多个等待与 Task.WaitAll - 等效吗?

2024-04-12

从性能上来说,这2个方法会跑吗GetAllWidgets() and GetAllFoos()在平行下?

有什么理由使用其中一种而不是另一种吗?编译器在幕后似乎发生了很多事情,所以我不清楚。

============= 方法A:使用多个等待======================

public async Task<IHttpActionResult> MethodA()
{
    var customer = new Customer();

    customer.Widgets = await _widgetService.GetAllWidgets();
    customer.Foos = await _fooService.GetAllFoos();

    return Ok(customer);
}

=============== 方法B:使用Task.WaitAll =====================

public async Task<IHttpActionResult> MethodB()
{
    var customer = new Customer();

    var getAllWidgetsTask = _widgetService.GetAllWidgets();
    var getAllFoosTask = _fooService.GetAllFos();

    Task.WaitAll(new List[] {getAllWidgetsTask, getAllFoosTask});

    customer.Widgets = getAllWidgetsTask.Result;
    customer.Foos = getAllFoosTask.Result;

    return Ok(customer);
}

=======================================


第一个选项不会同时执行这两个操作。它将执行第一个并等待其完成,然后才执行第二个。

第二个选项将同时执行两者,但将同步等待它们(即在阻塞线程时)。

您不应该使用这两个选项,因为第一个选项的完成速度比第二个选项慢,并且第二个选项会不必要地阻塞线程。

您应该异步等待这两个操作Task.WhenAll:

public async Task<IHttpActionResult> MethodB()
{
    var customer = new Customer();

    var getAllWidgetsTask = _widgetService.GetAllWidgets();
    var getAllFoosTask = _fooService.GetAllFos();

    await Task.WhenAll(getAllWidgetsTask, getAllFoosTask);

    customer.Widgets = await getAllWidgetsTask;
    customer.Foos = await getAllFoosTask;

    return Ok(customer);
}

请注意,之后Task.WhenAll完成了已经完成的两项任务,因此等待它们立即完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个等待与 Task.WaitAll - 等效吗? 的相关文章

随机推荐

  • 如何确定折叠工具栏已折叠?

    我需要知道材料设计库中的 CollapsingToolbar 何时折叠 正如 Marko 所说 这可以使用您自己的 OnOffsetChangedListener 实现来实现 AppBarLayout appBarLayout AppBar
  • 反转/吹出 GROUP BY

    我正在处理按项目编号和计数分组的数据 每条记录都有一个count gt 2需要分解成单独的记录 并在该级别与另一组不同的数据进行比较 数据看起来像这样 它被困在这种格式中 这是客户发送它的唯一方式 OwnerNumber ItemCode
  • 是否可以从手机设置中授予附近 API 权限?

    Question 是否可以从手机设置中授予附近 API 权限 如果是这样 怎么办 答案是否因设备 API 级别而异 如果需要 请继续阅读以获取更多背景信息 一般背景 当面向 API 级别 23 或更高级别的应用安装在运行 API 级别 23
  • 使用 Firestore REST API 和本地模拟器套件创建新文档,返回错误 404:路径参数问题

    作为一名初学者 我刚刚熟悉 Firebase Firestore 并且正在尝试为朋友为其项目编写的一组可调用函数创建集成测试 我正在编写一个测试来使用 Firebase 本地模拟器套件进行自动化测试 现在 我正在尝试使用 Axios 编写一
  • 向 POCO 类添加方法

    我有以下设置 MVC gt 服务 gt 存储库 现在我想让用户能够向文档添加注释 只有与文档关联的用户 作为所有者或审阅者 才能添加注释 因此在我的 NoteService 中 我执行以下操作以确保用户对所选文档具有权限 public No
  • 转换为 int16、int32、int64 - 您如何知道选择哪一个?

    我经常必须转换检索到的值 通常作为字符串 然后将其转换为 int 但在 C Net 中 您必须选择 int16 int32 或 int64 当您不知道检索到的数字有多大时 您如何知道选择哪一个 这里每个提到声明 Int16 保存 ram 的
  • 使用多个数组元素为相同符号生成多行(Pine 脚本)

    基于这个解决方案 https stackoverflow com questions 66370664 how to overcome compiled script code is too long in pine script来自 Bj
  • 汇编程序中的重定位截断错误

    我对汇编语言完全陌生 我尝试编写简单的程序来破译凯撒密码 问题是链接后我收到以下错误 cezar o In function loop text 0xbf relocation truncated to fit R X86 64 8 aga
  • 通过环境变量告诉 ld 在哪里查找目录

    我正在对课程的 C 和 C 文件进行评分 并且此作业使用 GSL 库 由于我的计算机没有 root 权限 因此我的 GSL 库安装在我的主目录中 因此我需要告诉编译器和链接器在哪里可以找到它 当我自己编写程序时 这不是问题 因为我只需向 g
  • 按字典值对字典列表进行排序

    我有以下字典列表 a 23 100 3 103 2 102 36 103 43 123 我如何对其进行排序以获得 a 43 123 3 103 36 103 2 102 23 100 我的意思是 按字典值对列表进行降序排序 除了brandi
  • Puppeteer - 如何使用 page.evaluateHandle

    我在使用最新版本的 puppeteer 时遇到一些问题 我正在使用 puppeteer 版本 0 13 0 我有一个包含此元素的网站 div class header hey there div 我正在尝试运行这段代码 const head
  • 在 boost 几何体中创建实心多边形

    我是增强几何的新手 我已经创建了多边形boost geometry assign points 但我只创建该多边形的外部和内部是空的 所以我尝试测试boost geometry overlaps 两个多边形 A B 且 A 在 B 内部 结
  • Mysql按分钟查询、选择、分组、求和

    我有一个像这样的数据库表 id donation type donation amount time inserted 1 em1 20 2012 12 07 10 01 00 2 em1 50 2012 12 07 10 01 00 3
  • 如何使用 Java 开发 iPhone 应用程序? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道是否可以使用 Java 加 XMLV 来开发 iPhone 应用程序 XMLV 声称可以将基于 Java 的 Android
  • jquery-ajax 多次调用

    我使用以下代码来发出多个 ajax 请求 如下所示 request 1 start 要求1 finish 要求2 start 要求2 finish 这是代码 var startingpoint fireRequest 1 each type
  • 如何将清单信息添加到delphi项目中

    添加最简单的方法是什么
  • 如何在 Haskell 中使用 TypeApplications?

    With XTypeApplications在 GHC 8 0 中 您可以使用显式指定类型 前面的函数参数 它到底指定了什么类型 尤其是当有多个类型时 有介绍吗 如果你看一下函数的类型 elem Foldable t Eq a gt a g
  • 适用于 Android/Java 的“自从/以前的时间”库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 对于 Android Java 显示时间的好库有什么建议吗 例如 10 分钟前 5 天前 来自 Goog
  • 多个目标名称具有相同的动画

    只是一个疑问 我的 WPF 应用程序中有三个图像 我将为这三个图像提供闪烁效果 所以我给出了这段代码
  • 多个等待与 Task.WaitAll - 等效吗?

    从性能上来说 这2个方法会跑吗GetAllWidgets and GetAllFoos 在平行下 有什么理由使用其中一种而不是另一种吗 编译器在幕后似乎发生了很多事情 所以我不清楚 方法A 使用多个等待 public async Task