. Wait()与. GetWaiter() . GetResult()之间的区别是什么?

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

33360 次浏览

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

区别主要在于处理异常。对于 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,而不是“物理方式运行”。

参考资料来源(当然是非合同的)就是一个例子。