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
将会并发执行,然后在调用线程上阻塞等待它们执行完成。
回过头来说下你的场景,我觉得两者都不该用,原因有两点:
MethodA 肯定是比 MethodB 要慢。
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# 中使用异步的套路比较多,弄着弄着很多初学者就搞不清楚了,所以说还是得多学多练多理解。
NET问答: 多个 await 和 Task.WaitAll 是等价的吗?相关推荐
- NET(C#):await返回Task的async方法
一. FrameWork 4.0之前的线程世界 在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用 ...
- .net中Task.WaitAll和WaitAny同步的等待Task完成
前面讲了<.net中async/await异步编程>,如果方法中使用了多个异步方法,该如何同步的等待Task完成? Task.WaitAll 等待提供的所有 System.Threadin ...
- .NET(C#):await返回Task的async方法
一. FrameWork 4.0之前的线程世界 在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用 ...
- async、await与task
task是开启一个新的线程去做你需要做的事情,后面的代码会直接运行,这样可以防止线程阻塞 private void button1_Click(object sender, EventArgs e) ...
- C# Task.WaitAll 方法
定义 命名空间: System.Threading.Tasks 程序集: mscorlib.dll, netstandard.dll 等待所有提供的 Task 对象完成执行过程. 重载 重载 Wait ...
- NET问答: using 和 await using 有什么不同?
咨询区 Justin Lessard: 我注意到在某些情况下,visual studio 经常推荐我这么做. await using var disposable = new Disposable() ...
- NET问答: 如何取消或中止 Task 执行 ?
咨询区 Patrice Pezillier: 我在一个线程里创建了若干了task并开启执行,当我在业务逻辑中执行了 Thread.Abort() 之后,我发现这些 Task 并没有被终止掉? 问题来了 ...
- python3 协程asyncio 调用步骤、阻塞和await、task任务、future对象 partial
首先介绍一下 偏函数 如果需要减少某个函数的参数个数,你可以使用 functools.partial() [作用一]:partial() 函数允许你给一个或多个参数设置固定的值,减少接下来被调用时的参 ...
- .Net 多线程 异步编程 Await、Async和Task
await和async简介 await和async是在C#5中引入,并且在.NetFramewor4.5以及.NetCore中进行了支持.主要是解决性能瓶颈,并且增强系统的响应能力. msdn关于 ...
最新文章
- 这三个普通程序员,几个月就成功转型AI,他们的经验是...
- java定时扫描_springmvc 定时扫描
- Swift-跳转到tableView指定位置
- 我的问道游戏主题皮肤
- 使用 keras 训练大规模数据
- POJ-2155 Matrix 二维线段树 | 树状数组
- windows下配置mysql数据库_mysql数据库1-windows下mysql安装及配置
- linux xps 13 wifi,XPS13-9350安装linux以及网卡连接失败修复的临时方案
- 栈顶指针到底指向哪_被称为“程序员试金石”的指针真的没有那么难!不信的话你来看看
- root能写入东西,其它账号不能写,可能的原因
- mysql ip to int_ip网段转换程序(把ip地址转换成相对就的整数)
- 如何加精准粉丝,一个巧妙实用的方法!
- Cisco STP生成树协议
- 5gh掌上云计算认证不通过_5GH币项目介绍及评级分析
- 秒懂商用区块链关键技术:智能合约
- Java职业规划(职业晋升路线、技术转移路线、工作经验与技术栈的匹配)——学习笔记
- [Loj 6070][回文树+可持久化线段树+border理论]基因
- 机器智能正在代替人类做的5件事
- Origin数据设置为日期/时间的方法
- 一个扫描器搞定TCP协议所有问题