66 c# multithreading asynchronous
我的方法返回Task.我想等到它完成.我应该使用
.Wait()或.GetAwaiter().GetResult()?他们之间有什么区别?
Lua*_*aan 78
两者都是同步等待操作的结果(如果可能的话,你应该避免这些).
差异主要在于处理异常.有了Wait,异常堆栈跟踪没有改变,并代表异常时的实际堆栈,所以如果你有一段代码在一个线程池线程上运行,你就有一个类似的堆栈
ThreadPoolThread.RunTask
YourCode.SomeWork
Run Code Online (Sandbox Code Playgroud)
另一方面,.GetAwaiter().GetResult()将重新编写堆栈跟踪以考虑所有异步上下文,忽略代码的某些部分在UI线程上执行,而某些部分在ThreadPool线程上执行,而某些部分只是异步I/O. 因此,您的堆栈跟踪将反映代码中的同步步骤:
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
Run Code Online (Sandbox Code Playgroud)
至少可以说,这往往会使异常堆栈跟踪更加有用.您可以在应用程序的上下文中查看YourCode.SomeWork调用的位置,而不是"它运行的物理方式".
这是如何工作的一个例子是在参考源(当然是非契约的).