咨询区

  • 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# 中使用异步的套路比较多,弄着弄着很多初学者就搞不清楚了,所以说还是得多学多练多理解。

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

  1. NET(C#):await返回Task的async方法

    一.  FrameWork 4.0之前的线程世界    在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用 ...

  2. .net中Task.WaitAll和WaitAny同步的等待Task完成

    前面讲了<.net中async/await异步编程>,如果方法中使用了多个异步方法,该如何同步的等待Task完成? Task.WaitAll 等待提供的所有 System.Threadin ...

  3. .NET(C#):await返回Task的async方法

    一.  FrameWork 4.0之前的线程世界    在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用 ...

  4. async、await与task

    task是开启一个新的线程去做你需要做的事情,后面的代码会直接运行,这样可以防止线程阻塞 private void button1_Click(object sender, EventArgs e) ...

  5. C# Task.WaitAll 方法

    定义 命名空间: System.Threading.Tasks 程序集: mscorlib.dll, netstandard.dll 等待所有提供的 Task 对象完成执行过程. 重载 重载 Wait ...

  6. NET问答: using 和 await using 有什么不同?

    咨询区 Justin Lessard: 我注意到在某些情况下,visual studio 经常推荐我这么做. await using var disposable = new Disposable() ...

  7. NET问答: 如何取消或中止 Task 执行 ?

    咨询区 Patrice Pezillier: 我在一个线程里创建了若干了task并开启执行,当我在业务逻辑中执行了 Thread.Abort() 之后,我发现这些 Task 并没有被终止掉? 问题来了 ...

  8. python3 协程asyncio 调用步骤、阻塞和await、task任务、future对象 partial

    首先介绍一下 偏函数 如果需要减少某个函数的参数个数,你可以使用 functools.partial() [作用一]:partial() 函数允许你给一个或多个参数设置固定的值,减少接下来被调用时的参 ...

  9. .Net 多线程 异步编程 Await、Async和Task

    await和async简介   await和async是在C#5中引入,并且在.NetFramewor4.5以及.NetCore中进行了支持.主要是解决性能瓶颈,并且增强系统的响应能力. msdn关于 ...

最新文章

  1. 这三个普通程序员,几个月就成功转型AI,他们的经验是...
  2. java定时扫描_springmvc 定时扫描
  3. Swift-跳转到tableView指定位置
  4. 我的问道游戏主题皮肤
  5. 使用 keras 训练大规模数据
  6. POJ-2155 Matrix 二维线段树 | 树状数组
  7. windows下配置mysql数据库_mysql数据库1-windows下mysql安装及配置
  8. linux xps 13 wifi,XPS13-9350安装linux以及网卡连接失败修复的临时方案
  9. 栈顶指针到底指向哪_被称为“程序员试金石”的指针真的没有那么难!不信的话你来看看
  10. root能写入东西,其它账号不能写,可能的原因
  11. mysql ip to int_ip网段转换程序(把ip地址转换成相对就的整数)
  12. 如何加精准粉丝,一个巧妙实用的方法!
  13. Cisco STP生成树协议
  14. 5gh掌上云计算认证不通过_5GH币项目介绍及评级分析
  15. 秒懂商用区块链关键技术:智能合约
  16. Java职业规划(职业晋升路线、技术转移路线、工作经验与技术栈的匹配)——学习笔记
  17. [Loj 6070][回文树+可持久化线段树+border理论]基因
  18. 机器智能正在代替人类做的5件事
  19. Origin数据设置为日期/时间的方法
  20. 一个扫描器搞定TCP协议所有问题

热门文章

  1. Win10 jdk的安装以及环境变量的配置,及需要注意的坑
  2. ------shell学习
  3. HTFS.Software.v7.3-ISO 1DVD(传热模拟,最新完全解密版)
  4. DataForm 中通过外面的按钮进行提交时,出错
  5. live555学习笔记7-RTP打包与发送
  6. 如何使用卡巴斯基急救盘清理感染的PC
  7. 笔记本本地连接显示电缆拔出_没有安全电缆槽的笔记本电脑如何固定?
  8. 11 个 Nginx 参数性能优化工作
  9. Oracle-13:Oracle中的表分区
  10. 基于scikit-learn机器学习库的分类预测