비동기 작업의 동기 실행: Task.Result와 Task.GetAwaiter().GetResult()의 차이점
비동기 메소드를 다룰 때 동기적으로 실행해야 하는 경우가 있습니다. 그러나 동기식으로 실행하는 두 가지 일반적인 방법은 Task.Result
과 Task.GetAwaiter().GetResult()
이며, 둘 사이에는 주요 차이점이 있습니다.
Task.Wait와 Task.GetAwaiter().GetResult() 비교
Task.Wait
및 Task.GetAwaiter().GetResult()
모두 비동기 작업을 동기적으로 실행할 수 있습니다. 그러나 예외 처리 메커니즘은 다릅니다. Task.Wait
은 모든 예외를 AggregateException
에 래핑하는 반면 Task.GetAwaiter().GetResult()
은 원래 예외를 직접 발생시킵니다.
제안
원시 예외를 직접 처리하려면 Task.GetAwaiter().GetResult()
이 Task.Wait
보다 낫습니다. 그러나 처음 두 가지 방법은 교착 상태 및 스레드 풀 리소스 고갈 문제로 이어질 수 있으므로 async/await
을 사용하는 것보다 두 방법 모두 피해야 합니다.
차이 이유
Task.Wait
과 Task.GetAwaiter().GetResult()
사이의 예외 처리 차이는 Microsoft의 엄격한 호환성 요구 사항에서 비롯됩니다. 기존 코드가 손상되는 것을 방지하기 위해 Task.Wait
는 AggregateException
에 예외를 래핑하여 원래 차단 동작을 유지합니다.
예외 전파를 직접 실행하려면 task.GetAwaiter().GetResult()
을 사용할 수 있습니다. Task.Result
은 작업 실행을 차단하는 대신 작업 오류를 확인합니다.
위 내용은 task.result vs. task.getawaiter (). getResult () : 동기 실행 및 예외 처리의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!