내 방법은 Task
. 끝날 때까지 기다리고 싶어요. .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
호출 된 위치를 확인할 수 있습니다 .
이것이 어떻게 작동하는지에 대한 예는 참조 소스에 있습니다 (물론 비 계약 적).
TaskAwaiter
는 구현 세부 사항입니다. 한편, awaitable /의 awaiter 메커니즘은 문서화되고, 용도 오리 - 입력 - GetAwaiter
이다 await
로 GetEnumerator
하는 것입니다 foreach
또는 Dispose
이다 using
. 이 모든 것은 사용중인 특정 대기자에 관계없이 C # 사양에 정의되어 Task.GetAwaiter
있습니다. "응용 프로그램 코드에서 사용하기보다는 컴파일러 사용을위한 것" 이라는 점에 유의하십시오 . 그러나 포인트는 사용 목적이 작업을 수행하는 것입니다 await
하지 Wait()
않고 GetAwaiter().GetResult()
있지만 - GetResult
당신이 그것을 필요로하는 경우에 당신에게 더 좋은 스택을 제공합니다.