c# - .Wait() 和 .GetAwaiter().GetResult() 有什么区别?

标签 c# multithreading asynchronous

我的方法返回 Task。我想等到它完成。我应该用什么 .Wait() 还是 .GetAwaiter().GetResult()?它们有什么区别?

最佳答案

两者都是同步等待操作结果(您应该尽可能避免这些)。

区别主要在于处理异常。使用 Wait 时,异常堆栈跟踪不会改变并代表异常发生时的实际堆栈,因此如果您有一段代码在线程池线程上运行,您将拥有像这样堆叠

ThreadPoolThread.RunTask
YourCode.SomeWork

另一方面,.GetAwaiter().GetResult() 将重新处理堆栈跟踪以考虑所有异步上下文,忽略部分代码在 UI 线程上执行,有些在 ThreadPool 线程上,有些只是异步 I/O。因此,您的堆栈跟踪将反射(reflect)通过您的代码 的类似同步的步骤:

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

至少可以说,这往往会使异常堆栈跟踪更有用。您可以看到 YourCode.SomeWork 在您的应用程序上下文中被调用的位置,而不是“它运行的物理方式”。

有关其工作原理的示例在 reference source 中。 (当然是非契约(Contract)性的)。

关于c# - .Wait() 和 .GetAwaiter().GetResult() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36426937/

相关文章:

c# - 如果我不注意警告 "hides inherited member. To make the current member override that implementation...."怎么办

c++ - 线程调用函数模板时的编译错误(对于默认参数)

multithreading - 卡在Rust中的 channel 接收器迭代器上?

python - 异步 Python 真的是异步的吗?

c# - 如何对数字进行编码,以便微小的变化导致非常不同的编码?

c# - 我怎么知道一个对象是否派生自特定的泛型类?

c# - EF 使用新引用更新现有实体并获取违反唯一键约束

c#BeginInvoke问题

javascript - 将多个可观察量的结果处理到数据库并添加到数据库一次

asynchronous - MvvmCross异步命令锁