비동기 메소드를 동기적으로 호출
질문:
다음 서명이 있는 비동기 메서드가 있습니다.
public async Task<string> GenerateCodeAsync() { string code = await GenerateCodeService.GenerateCodeAsync(); return code; }
그러나 동기화 컨텍스트에서 이 메서드를 동기적으로 호출해야 합니다. 그것을 달성하는 방법?
해결책:
비동기 메서드를 동기적으로 호출하려면 스레드 풀 스레드를 사용하여 메서드를 실행할 수 있습니다. 작업의 waiter를 사용하면 비동기 작업이 완료될 때까지 호출 스레드를 차단할 수 있습니다.
string code = Task.Run(() => GenerateCodeAsync()) .GetAwaiter() .GetResult();
참고:
.Result
을 직접 사용하는 경우의 단점에 주의해야 합니다.
.Result
을 사용하면 기본 스레드가 차단되어 비동기 메서드가 완료되지 않아 교착 상태가 발생할 수 있습니다. 이를 방지하려면 .ConfigureAwait(false)
을 주의해서 사용하세요. 이 접근 방식에는 합병증이 없지는 않습니다. 그러나 Task.Run
을 사용하여 스레드 풀 스레드에서 비동기 메서드를 실행하면 이러한 잠재적인 문제가 제거됩니다. .Result
비동기 메서드에서 발생한 모든 예외를 AggregateException
에 캡슐화합니다. 이 문제를 피하려면 .GetAwaiter().GetResult()
을 대신 사용하세요. 위 내용은 C#에서 비동기 메서드를 어떻게 동기적으로 호출할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!