我的方法返回 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/