2014-09-12 127 views
3

我期待從另一個開發這些代碼:異步操作立即等待

bool isValid = await engine.GetTaskByIdAsync(taskId); 
    if(isValid) 
    .... 

當我與async操作的工作,它是同時異步操作完成做獨立的工作:

Task<bool> task = engine.GetTaskByIdAsync(taskId); 

    //Do work that doesn't need the "task" variable 

    bool completed = await task; 
    if(bool) 
    .... 

看來,第一個例子啓動異步操作,然後立即開始等待。這裏有一些價值,我不明白嗎?

注意:此代碼位於應用程序的數據訪問層,因此不會與用戶界面進行交互。

+0

當然,啓動一個進程並立即返回,如果事先有邏輯,有什麼關係? – 2014-09-12 19:04:40

+0

「看起來,第一個例子啓動異步操作,然後立即開始等待」 - await「使我們在繼續之前等待呼叫完成。 – 2014-09-12 19:07:17

+0

你會怎麼做那個程序員做的*沒有*等待任務? – Servy 2014-09-12 19:07:57

回答

6

這裏有一些價值我不明白嗎?

絕對 - 這意味着,雖然你需要操作返回之前,你可以做任何更多的工作的價值,你不是當你等待它佔用一個線程。如果你正在編寫一個GUI,這一點尤其重要,因爲綁定GUI線程基本意味着凍結UI。

這聽起來像你正在關注異步的「並行處理多個事物」這一點,這很重要,但遠不止於此。

+0

好點,我專門用網絡工作,所以它不是我通常處理的事情。我在數據訪問層找到了這個代碼,所以很好奇,如果有什麼東西需要從中獲取。 – 2014-09-12 19:16:31

+1

@ChrisHardie Web應用程序仍然可以受益於異步。它可以允許Web請求在不執行CPU綁定工作時消耗線程池線程的時間,從而允許這些線程池線程爲其他請求提供服務,從而允許服務器擴展它可以服務的可能的併發請求數。 – Servy 2014-09-12 19:23:19

+0

@Servy首先,提高可用於Web服務器的線程數是不是更好?添加await會引入開銷,但不會奇蹟般地增加系統可用的CPU週期數。雖然你在技術上是正確的,但我認爲你最好是正確地調整你的網絡服務器。 – AVee 2014-09-12 20:39:19

0

常犯的錯誤是等待塊。它沒有。

當前線程立即返回,並且當異步任務完成時,該函數的其餘部分被註冊爲執行。