[c#] .Wait () 대 .GetAwaiter (). GetResult ()의 차이점은 무엇입니까?

내 방법은 Task. 끝날 때까지 기다리고 싶어요. .Wait()또는 무엇을 사용해야
.GetAwaiter().GetResult()합니까? 그들 사이의 차이점은 무엇입니까?



답변

둘 다 작업 결과에 대한 동기식 대기입니다 (가능한 경우이를 피해야합니다).

차이점은 주로 예외 처리에 있습니다. 을 사용 Wait하면 예외 스택 추적이 변경되지 않고 예외 시점의 실제 스택을 나타내므로 스레드 풀 스레드에서 실행되는 코드가 있다면 다음과 같은 스택을 갖게됩니다.

ThreadPoolThread.RunTask
YourCode.SomeWork

반면에는 .GetAwaiter().GetResult()코드의 일부가 UI 스레드에서 실행되고 일부는 ThreadPool 스레드에서 실행되고 일부는 단순히 비동기 I / O임을 무시하고 모든 비동기 컨텍스트를 고려하도록 스택 추적을 재 작업합니다. 따라서 스택 추적은 코드를 통해 동기식 단계를 반영합니다 .

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

이것은 예외 스택 추적을 훨씬 더 유용하게 만드는 경향이 있습니다. “물리적으로 실행되는 방식”이 아니라 애플리케이션 컨텍스트에서YourCode.SomeWork 호출 위치를 확인할 수 있습니다 .

이것이 어떻게 작동하는지에 대한 예는 참조 소스에 있습니다 (물론 비 계약 적).


답변