2015-08-27 116 views
7

什麼做以下的區別:等待VS Task.Result在異步方法

async Task<T> method(){ 
    var r = await dynamodb.GetItemAsync(...) 
    return r.Item; 
} 

VS

async Task<T> method(){ 
    var task = dynamodb.GetItemAsync(...) 
    return task.Result.Item; 
} 

在我的情況下,由於某種原因,只有第二工程。第一個似乎永遠不會結束。

+0

那麼,爲什麼我發現一個的await都挺唯一的原因就是從下面的SO答案。我想我會在這裏發表評論來幫助未來的我。 https://stackoverflow.com/questions/13489065/best-practice-to-call-configureawait-for-all-server-side-code https://stackoverflow.com/questions/9895048/ async-call-with-await -in-httpclient-never-returns/10369275#10369275 –

回答

15

await異步解開任務的結果,而只是使用結果會阻塞,直到任務完成。

See this explanantion from Jon Skeet.

+1

爲什麼在這種情況下不等待工作,但是結果確實工作 – luis

+3

@luis:缺少任何其他信息,我所看到的唯一答案就是它實際上並不在「await」情況下工作。你只是錯誤地認爲它是因爲方法本身返回。但是,正在等待的任務可能不會以任何方式完成。如果你想得到_that_的答案(這與你提出的問題不同),你需要發佈一個新問題,清楚地說明,並提供[一個很好的_minimal_,_complete_代碼示例](https:// stackoverflow .com/help/mcve),可以可靠地重現問題。 –

3

task.Result正在訪問屬性的get訪問器阻塞調用線程,直到異步操作完成;它相當於撥打Wait method。 一旦操作的結果可用,它將被存儲並在隨後對Result屬性的調用中立即返回。請注意,如果在任務操作期間發生異常,或者任務已被取消,則Result屬性不返回值。相反,嘗試訪問屬性值會引發AggregateException異常。 唯一的區別是await不會阻塞。相反,它將異步等待任務完成,然後繼續執行

+3

雖然爲什麼在這種情況下不等待工作,但是結果確實起作用 – luis