我嘗試閱讀 stackoverflow 中有關 的許多文章和問題async/await,因此基本上是異步方法呼叫,但不知何故,我仍然無法解碼它如何提供并行性和非阻塞行為。我提到了一些像這樣的帖子
幾乎在任何地方都可以使用 async/await 嗎?
https://news.ycombinator.com/item?id=19010989
使用 async 和 await 關鍵字的好處
所以如果我寫一段這樣的代碼
var user = await GetUserFromDBAsync();
var destination = await GetDestinationFromDBAsync();
var address = await GetAddressFromDBAsync();
即使這三種方法都是異步的,但代碼仍然不會轉到第二行destination從資料庫中獲取,直到它完全從資料庫中獲取user。
那么這里的并行性和非阻塞行為在哪里asyn/await。在執行下一行之前,它仍然等待完成第一個操作。
或者我對異步的完全理解是錯誤的?
編輯
任何例子都會有幫助!
uj5u.com熱心網友回復:
async/await 的重點不在于方法執行得更快。相反,它是關于當這些方法正在等待來自資料庫、檔案系統、HTTP 請求或其他一些 I/O 的回應時執行緒正在做什么。
如果沒有異步執行,執行緒只是等待。從某種意義上說,它被浪費了,因為在那段時間里它什么都不做。我們沒有無限的執行緒供應,因此讓執行緒坐等是一種浪費。
Async/await 只是允許執行緒做其他事情。執行緒可以為其他一些請求提供服務,而不是等待。然后,當資料庫查詢完成或 HTTP 請求收到回應時,下一個可用執行緒將執行該代碼。
所以是的,您示例中的各個行仍按順序執行。他們只是更有效地執行。如果您的應用程式正在接收許多請求,它可以更快地處理這些請求,因為有更多執行緒可用于作業而不是阻塞,只是等待來自某些 I/O 操作的回應。
我強烈推薦這篇博文:沒有執行緒。有一些混淆 async/await 是關于在另一個執行緒上執行某些操作。它根本不是關于那個的。這是關于確保沒有執行緒在它可以做其他事情時坐著等待。
uj5u.com熱心網友回復:
您可以并行/并發地執行它們,并且仍然以非阻塞方式等待它們Task.WhenAll。您不必單獨等待每個異步方法呼叫。因此,您可以獲得性能提升,同時擁有回應式 UI:
//create 3 "cold" tasks, that are not yet running
var userTask = GetUserFromDBAsync();
var destinationTask = GetDestinationFromDBAsync();
var addressTask = GetAddressFromDBAsync();
//start running and awaiting all of them at (almost) the same time
await Task.WhenAll(userTask, destinationTask, adressTask);
//get the cached results
var user = userTask.Result;
var destination = destinationTask.Result;
var address = addressTask.Result;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/368500.html
上一篇:并行檔案下載損壞
