2017-01-03 150 views
2

這兩種方法之間的實際區別(如果有的話)是什麼?異步方法 - 等待和返回任務之間的區別

public static Task DoSomething() 
    { 
     return FooAsync(); 
    } 

    public static async Task DoSomethingAsync() 
    { 
     await FooAsync(); 
    } 
+2

[這裏是一個很好的開始...](https://msdn.microsoft.com/en-us/library/mt674882.aspx) –

+0

將此標記爲重複的人是錯誤的。 OP不會問是否使用其中一個,而是有什麼區別,答案與鏈接問題中的答案有很大不同。 – Bauss

回答

2

實際差別使用這些方面是:什麼都沒有。兩者都是「等候」的。

生成的代碼會有一個小的差異,異步版本將變成一個狀態機。沒有什麼可擔心的。

由於這些方法別無其他,所以很難相互比較。第一個(最簡單的)會做。

0

等待將實際上等待任務完成並返回結果。當你返回一個任務時,它會返回一個將在將來完成的任務的句柄,因此你在等待任務來獲得結果。

+0

使用'await'的方法無論如何返回一個任務,所以你*仍然*必須等待他們 –

+0

'await'不等待'FooAsync()'完成,它立即返回給調用者(如果'Task'由'FooAsync()'返回的數據尚未完成)。當內部任務完成時,'DoSomethingAsync()'最終會在await後恢復......所以沒有什麼區別,因爲沒有什麼可以恢復......這只是編譯器的開銷。 –

+0

是的,我同意它放棄控制,但它等待將使它等待結果。我並不是說等待會使它同步,使它成爲一個阻塞呼叫。 –

0

DoSomething()將在調用者詢問時執行。 所以它會被執行時,你會做await DoSomething();。但是你可以存儲在一個變量的任務,後來執行它:

var task = DoSomething(); 
// Do stuff 
await task(); 

隨着DoSomethingAsync,叫時,它就會被執行。因爲它是異步的。

+0

是的,一個是異步的。但兩者都有'延遲執行',調用FooAsync()的時間或方式完全沒有區別。 –