我的方法返回Task
。我想等到它完成。我该怎么用
.Wait()
或.GetAwaiter().GetResult()
?他们之间有什么区别?
答案 0 :(得分:69)
两者都是同步等待操作的结果(如果可能的话,你应该避免这些)。
差异主要在于处理异常。使用Wait
,异常堆栈跟踪不会改变并表示异常时的实际堆栈,因此如果您有一段代码在线程池线程上运行,那么您将拥有一个堆栈像
ThreadPoolThread.RunTask
YourCode.SomeWork
另一方面,.GetAwaiter().GetResult()
将重写堆栈跟踪以考虑所有异步上下文,忽略代码的某些部分在UI线程上执行,而某些部分在ThreadPool线程上执行,有些是简单的异步I / O.因此,您的堆栈跟踪将通过您的代码反映出类似同步的步骤:
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
至少可以说,这往往会使异常堆栈跟踪更加有用。您可以在应用程序的上下文中看到YourCode.SomeWork
被称为的位置,而不是"它运行的物理方式"。
这是如何运作的一个例子是reference source(非契约当然)。