兩者都是同步等待操作的結果
差異主要在於處理異常.使用Wait,異常堆棧跟蹤不會改變並表示異常時的實際堆棧,因此如果您有一段代碼在線程池線程上運行,那么您將擁有類似的堆棧
ThreadPoolThread.RunTask
YourCode.SomeWork
另一方面,.GetAwaiter().GetResult()將重寫堆棧跟蹤以考慮所有異步上下文,忽略代碼的某些部分在UI線程上執行,而某些部分在ThreadPool線程上執行,有些是簡單的異步I / O.因此,您的堆棧跟蹤將反映代碼中的同步步驟:
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
至少可以說,這往往會使異常堆棧跟蹤更加有用.您可以在應用程序的上下文中查看調用YourCode.SomeWork的位置,而不是“它運行的物理方式”.
這是如何工作的一個例子是在reference source(當然是非契約的).