我的方法返回 Task。我想等到它完成。我应该使用什么 .Wait()还是 .GetAwaiter().GetResult()? 它们之间有什么区别?
Task
.Wait()
.GetAwaiter().GetResult()
两者都是同步等待操作结果(如果可能的话,应该避免这种情况)。
区别主要在于处理异常。对于 Wait,异常堆栈跟踪是不变的,并且表示异常发生时的实际堆栈,所以如果有一段代码在线程池线程上运行,那么就会有一个类似的堆栈
Wait
ThreadPoolThread.RunTask YourCode.SomeWork
另一方面,.GetAwaiter().GetResult()将重新处理堆栈跟踪以考虑所有异步上下文,忽略一些代码部分在 UI 线程上执行,一些在 ThreadPool 线程上执行,还有一些仅仅是异步 I/O。因此,您的堆栈跟踪将通过 你的密码反映类似于同步的步骤:
TheSyncMethodThatWaitsForTheAsyncMethod YourCode.SomeAsyncMethod SomeAsync YourCode.SomeWork
至少可以说,这会使异常堆栈跟踪更加有用。你可以看到在哪里 YourCode.SomeWork被称为 in the context of your application,而不是“物理方式运行”。
YourCode.SomeWork
参考资料来源(当然是非合同的)就是一个例子。