Task.Result是否与.GetAwaiter.GetResult()相同?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (28)

我最近读到了一些代码,这些代码使用了很多异步方法,但有时需要同步执行。代码:

Foo foo = GetFooAsync(...).GetAwaiter().GetResult();

这和下面的一样吗?

Foo foo = GetFooAsync(...).Result;

提问于
用户回答回答于

https://github.com/aspnet/Security/issues/59

“最后一句话:你应该尽可能地避免使用Task.ResultTask.Wait因为它们总是将内部异常封装在 AggregateException一个通用的(发生一个或多个错误)消息中,这使得调试更加困难。即使同步版本不应该经常使用,你应该强烈考虑使用Task.GetAwaiter().GetResult()。“

用户回答回答于

差不多。虽然有一点小小的区别:如果Task失败了,GetResult()会直接抛出异常,而Task.Result会抛出一个AggregateException。但是,如果使用其中的任何一个,这async有什么意义?100倍更好的选择是使用await

另外,你不打算使用GetResult()。它意味着仅供编译器使用。但是如果你不想让人讨厌AggregateException,就用它吧。

扫码关注云+社区