2015-08-27 114 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