NET问答: 多个 await 和 Task.WaitAll 是等价的吗?

咨询区

  • vidalsasoon

我有下面两个方法:

MethodA: 使用多个 await 方式


public async Task<IHttpActionResult> MethodA()
{var customer = new Customer();customer.Widgets = await _widgetService.GetAllWidgets();customer.Foos = await _fooService.GetAllFoos();return Ok(customer);
}

MethodB: 使用 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);
}

请问从执行流程上来看,这两个方法都是并行执行的吗?是否有一些理由可以让我使用某一个而不使用另一个,我知道这背后的 编译器 对我隐藏了很多的细节,所以在选择上我还是有点懵。

回答区

  • i3arnon

你的 MethodA 并不是同步执行的,它的流程是异步串行,即第二个方法必须等待第一个方法执行结束,你的 MethodB 将会并发执行,然后在调用线程上阻塞等待它们执行完成。

回过头来说下你的场景,我觉得两者都不该用,原因有两点:

  1. MethodA 肯定是比 MethodB 要慢。

  2. MethodB 使用了不必要的阻塞。

言外之意,你可以巧妙的组合它们,比如用: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);
}

点评区

这个问题问的挺好的,因为在 C# 中使用异步的套路比较多,弄着弄着很多初学者就搞不清楚了,所以说还是得多学多练多理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类选项html 最后无距离,各种距离 一览无遗

offsetLeft,Left,clientLeft的区别假设 obj 为某个 HTML 控件obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算上侧位置&#xff0c;整型&#xff0c;单位像素。obj.offsetLeft 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置&a…

华为起诉最新进展,国内航司暂停运行有关客机,收买家庭不得继续抚养被解救儿童,脸书创始人后悔没早学微信,这就是今天的大新闻...

今天是3月11日农历二月初五今天星期一没带耳机线感觉这样用手机是没有灵魂的下面是今天的大新闻华为起诉最新进展&#xff08;环球网&#xff09;多个来自美国的消息证实&#xff0c;美国的联邦法院已经就华为公司起诉美国政府一案给美国政府及其多位部长发去了法院传票。上图&…

前目的地罗伯森是谁_距离目的地只剩10公里,开车师傅却在高速公路上睡着了...

钱江晚报小时新闻记者 吴崇远 通讯员 俞斐“我从杭州过来&#xff0c;刚才开累了&#xff0c;就休息了几分钟……”“杭州到嘉善那么一点路都犯困了&#xff1f;”4月6日凌晨4点30分&#xff0c;高速交警嘉兴支队值班民警在巡逻时发现&#xff0c;一辆厢式小货车开着双跳灯&…

WPF 写一个提醒工具软件(完整项目)

昨天整理硬盘时&#xff0c;偶然发现一个很久之前写的小工具&#xff0c;一个提醒工具。包含定时提醒&#xff0c;间隔提醒功能。看看效果&#xff1a;界面看起来也还凑合&#xff0c;还使用了HandyControl&#xff0c;有桌面托盘功能界面是下面这样的提醒窗口有两种&#xff0…

她只用1个方法,就把英语拿下了!

全世界只有3.14 % 的人关注了数据与算法之美这3招让你未来6个月讲一口流利英语怎么摆脱单词记不住&#xff1f;如何解决听不懂老外讲英语&#xff1f;让老外叹服你口语的唯一方法……请看中国著名口语教学专家写给你的一封信&#xff1a;亲爱的朋友&#xff1a;你好&#xff01…

getch, getche, getchar 转

(1) getch()和getche()函数 这两个函数都是从键盘上读入一个字符。其调用格式为: getch(); getche(); 两者的区别是: getch()函数不将读入的字符回显在显示屏幕上, 而getche() 函数却将读入的字符回显到显示屏幕上。 例1: #include<stdio.h> …

英语计算机工程师求职信,计算机工程师英文求职信范文

计算机工程师英文求职信范文是由个人简历模板网为你提供的一份个人求职信范文&#xff0c;可直接使用或根据实际情况进行修改。祝您职场顺利&#xff0c;早日找到称心如意的工作&#xff01;Dear Sir or Madam,I am writing to apply for a position as a computer engineer in…

WPF实现环(圆)形菜单

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织“ 前言&#xff0c;接着上一篇圆形菜单。”欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;02—代码如下一、…

C#源代码生成器

SdtcnCoder参考了TheBeerHouse的系统结构&#xff0c;采用了三层结构和缓存技术&#xff0c;这里对SdtcnCoder代码生成进行简单介绍.一、数据类型模型 1、 Field类是字段类型的基类&#xff0c;对SqlServer2005数据列属性进行了映射&#xff1b; 2、 BigInt、Binary等是具体类…

win7系统桌面计算机怎么打的开,windows7系统双击计算机打不开怎么解决|win7双击计算机打不开的解决方法...

运行windows7系统的时候双击"计算机"遇到打不开的情况&#xff0c;也不知道怎么回事&#xff0c;尝试用杀毒软件解决也无效。如果要查看磁盘的具体情况&#xff0c;都没办法查看了。针对win7双击"计算机"打不开的问题&#xff0c;下面小编介绍两种解决方法…

每日一笑 | 在俄罗斯人眼里,没有什么是胶带解决不了的

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

钣金缺口lisp_UG用钣金模块的放样创建天圆地方,还能学钣金展开,必看

上个给大家用“直纹”做了一个天圆地方的圆台模型&#xff0c;今天给大家讲解下UG钣金模块如何使用“放样弯边”做天圆地方管并展开&#xff0c;借用下上次的图纸数据。首先创建天圆地方钣金模型1首先新建模型&#xff0c;点击草图&#xff0c;以XY为草图平面&#xff0c;点击确…

我开发了一款基于web容器的前端项目容器

目前使用比较多的web容器有哪些&#xff1a;Apache php应用大多数用这个Nginx node应用基本都用这个Tomcat java应用基本都用这个IIS .net应用基本用这个 windows服务器才能用 linux的话有宇内大神开发的Jexus前端基本都是node应用&#xff0c;据我了解大体上分2种一种是 最终打…

两个init的区别

容器创建了Servlet实例后&#xff0c;它将调用实例的init&#xff08;ServletConfig)方法初始化Servlet.该方法的参数ServletConfig对象包含了在WEB应用程序的部署描述文件中指定的初始化参数。在init&#xff08;ServletConfig&#xff09;调用完后&#xff0c;容器将调用init…

这些Python骚操作,你值得拥有

全世界只有3.14 % 的人关注了数据与算法之美0x00 世界&#xff0c;你好程序员第一次接触语言或者框架&#xff0c;基本上都有个 Hello World 的例子&#xff0c;这里 Python 直接将它做成了一个包。0x01 Python 哲学Python 执行 import this 时&#xff0c;会打印出 Python 之禅…

晨风机器人突破限制_厉害了!工程建设领域首创!会自动测量、自动调平的测量机器人...

近日中建三局工程技术研究院自主研发的道路工程移动式高精度测量机器人在武汉四环线工程完成20余公里测试应用标志着机器人完成阶段性测试具备工程应用条件道路工程移动式高精度测量机器人是一种集自动行驶、自动调平自动设站、自动测量等功能于一身的机器人系统系首次在道路工…

简述本地组策略中用户和计算机配置的差异,组策略编辑器中的计算机配置和用户配置有什么区别吗?...

满意答案在计算机配置中的“关闭磁盘自动播放”功能&#xff0c;是针对&#xff0c;所有计算机用户的&#xff0c;也就是应用到整个计算机的策略。“用户配置”功能&#xff0c;仅应用到当前用户。如果用别的用户名登录计算机&#xff0c;配置后的组策略将不会启用。关于磁盘自…

晕了!这个配置值从哪来的?

如果有同事问你&#xff0c;数据库连接串的值和appsettings.json配的不一样&#xff0c;从哪来的&#xff1f;你能回答的出来吗?配置读取顺序ASP.NET Core 中的配置是使用一个或多个配置提供程序执行的&#xff0c;配置提供程序使用各种配置源从键值对读取配置数据。ASP.NET C…

鸟哥学习笔记---网络驱动器设备iSCSI

NAS&#xff1a;网络附加存储服务器SAN&#xff1a;存储局域网让LinuxPC变成一台可通过Web管理的NAS&#xff1a;FressNAS:http://sourceforge.net/projects/freenas/SAN提供“磁盘”给主机用&#xff0c;可以格式化&#xff0c;分区等&#xff1b;NAS提供的是“网络协议的文件…

client中周期性边界_「微评」增加艺术品在投资组合中的比例 推进国家艺术软实力...

艺术品作为一种兼具收藏属性和投资属性的物品&#xff0c;其最初被人们所接受的是其收藏属性。在进入二十一世纪后&#xff0c;其投资属性才逐渐显现。艺术品的双重属性增加了其投资价值&#xff0c;再叠加显著的顺周期性&#xff0c;艺术品能够在经济向好时为投资者提供超额收…