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


88

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

답변:


107

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

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

ThreadPoolThread.RunTask
YourCode.SomeWork

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

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

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

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


6
Task.GetAwaiter ()TaskAwaiter를 반환합니다 . 그러나 TaskAwaiter.GetResult ()에 대한 문서는 "이 API는 제품 인프라를 지원하며 사용자 코드에서 직접 사용할 수 없습니다 . "라고 조언 합니다. 댓글을 달 수 있습니까?
DavidRR

23
@DavidRR 전체 TaskAwaiter는 구현 세부 사항입니다. 한편, awaitable /의 awaiter 메커니즘은 문서화되고, 용도 오리 - 입력 - GetAwaiter이다 awaitGetEnumerator하는 것입니다 foreach또는 Dispose이다 using. 이 모든 것은 사용중인 특정 대기자에 관계없이 C # 사양에 정의되어 Task.GetAwaiter있습니다. "응용 프로그램 코드에서 사용하기보다는 컴파일러 사용을위한 것" 이라는 점에 유의하십시오 . 그러나 포인트는 사용 목적이 작업을 수행하는 것입니다 await하지 Wait()않고 GetAwaiter().GetResult()있지만 - GetResult당신이 그것을 필요로하는 경우에 당신에게 더 좋은 스택을 제공합니다.
Luaan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.