博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NET问答: 多个 await 和 Task.WaitAll 是等价的吗?
阅读量:4034 次
发布时间:2019-05-24

本文共 1374 字,大约阅读时间需要 4 分钟。

咨询区

  • vidalsasoon

我有下面两个方法:

MethodA: 使用多个 await 方式

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

MethodB: 使用 Task.WaitAll

public async Task
 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
 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://kqydi.baihongyu.com/

你可能感兴趣的文章
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
android给文字加边框(修改不能居中的问题)
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
coursesa课程 Python 3 programming Dictionary methods 字典的方法
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>
coursesa课程 Python 3 programming The while Statement
查看>>
course_2_assessment_6
查看>>