내 방법은 Task
. 끝날 때까지 기다리고 싶어요. .Wait()
또는 무엇을 사용해야
.GetAwaiter().GetResult()
합니까? 그들 사이의 차이점은 무엇입니까?
답변
둘 다 작업 결과에 대한 동기식 대기입니다 (가능한 경우이를 피해야합니다).
차이점은 주로 예외 처리에 있습니다. 을 사용 Wait
하면 예외 스택 추적이 변경되지 않고 예외 시점의 실제 스택을 나타내므로 스레드 풀 스레드에서 실행되는 코드가 있다면 다음과 같은 스택을 갖게됩니다.
ThreadPoolThread.RunTask
YourCode.SomeWork
반면에는 .GetAwaiter().GetResult()
코드의 일부가 UI 스레드에서 실행되고 일부는 ThreadPool 스레드에서 실행되고 일부는 단순히 비동기 I / O임을 무시하고 모든 비동기 컨텍스트를 고려하도록 스택 추적을 재 작업합니다. 따라서 스택 추적은 코드를 통해 동기식 단계를 반영합니다 .
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
이것은 예외 스택 추적을 훨씬 더 유용하게 만드는 경향이 있습니다. “물리적으로 실행되는 방식”이 아니라 애플리케이션 컨텍스트에서YourCode.SomeWork
호출 된 위치를 확인할 수 있습니다 .
이것이 어떻게 작동하는지에 대한 예는 참조 소스에 있습니다 (물론 비 계약 적).