.Wait()和.GetAwaiter()之间有什么区别.GetResult()?

时间:2016-04-05 12:53:41

标签: c# multithreading asynchronous

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

1 个答案:

答案 0 :(得分:69)

两者都是同步等待操作的结果(如果可能的话,你应该避免这些)。

差异主要在于处理异常。使用Wait,异常堆栈跟踪不会改变并表示异常时的实际堆栈,因此如果您有一段代码在线程池线程上运行,那么您将拥有一个堆栈像

ThreadPoolThread.RunTask
YourCode.SomeWork

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

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

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

这是如何运作的一个例子是reference source(非契约当然)。