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

lui*_*uis 32 c# asynchronous task async-await amazon-dynamodb

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

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

VS

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

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

Fra*_*rdo 44

await 异步展开任务的结果,而只是使用Result会阻塞,直到任务完成.

请参阅Jon Skeet的解释.

  • 为什么 await 在这种情况下不起作用,但 Result 确实有效 (5认同)
  • @luis:缺少任何其他信息,我看到的唯一答案是它实际上并没有在`await`情况下工作.你只是错误地认为它确实存在,因为方法本身会返回.但正在等待的任务可能无论如何都无法完成.如果你想要回答_that_(这是一个与你提出的问题不同的问题),你需要发一个新问题,明确说明并提供[一个好的,_minimal _,_complete_代码示例](https:// stackoverflow .com/help/mcve)可靠地再现问题. (4认同)
  • 所谓“结果”为裸是一个隐藏的死锁。 (2认同)
  • @user2953241:“.Result”或其所有可能的变体都会导致线程池线程等待线程池上的作业完成。这可能会耗尽线程池上的所有线程,导致没有线程执行实际工作。 (2认同)

NAS*_*SER 12

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

  • 为什么等待在这种情况下不起作用,但结果确实有效 (4认同)
  • 所谓“结果”为裸是一个隐藏的死锁。 (3认同)
  • 借助 Joshua,您可以在此处详细了解为什么它会导致隐藏的死锁:/sf/ask/1207407631/ (2认同)

归档时间:

查看次数:

62033 次

最近记录:

6 年,12 月 前