NET问答: 多个 await 和 Task.WaitAll 是等价的吗?
生活随笔
收集整理的這篇文章主要介紹了
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 是等价的吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MIPS衰落 LoongArch崛起
- 下一篇: WPF 写一个提醒工具软件(完整项目)