等待与异步方法中的Task.Result

时间:2015-08-27 02:20:44

标签: c# asynchronous async-await task amazon-dynamodb

执行以下操作之间的区别是什么:

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;
}

在我的情况下,由于某种原因,只有第二个工作。第一个似乎永远不会结束。

2 个答案:

答案 0 :(得分:35)

await异步解包您的任务结果,而只是使用Result会阻塞,直到任务完成。

See this explanantion from Jon Skeet.

答案 1 :(得分:11)

task.Result正在访问属性的get访问器阻塞调用线程,直到异步操作完成;它相当于调用Wait method。 一旦操作的结果可用,它就会被存储并在后续调用Result属性时立即返回。请注意,如果在任务操作期间发生异常,或者任务已被取消,则Result属性不会返回值。相反,尝试访问属性值会引发AggregateException异常。 唯一的区别是await不会阻止。相反,它将异步等待任务完成然后恢复