[c#] 비동기 메서드를 동 기적으로 호출



1 Answers

awaiter ( GetAwaiter() )를 GetAwaiter() 비동기 작업 완료 ( GetResult() ) 대기를 종료해야합니다.

string code = GenerateCodeAsync().GetAwaiter().GetResult();
Question

async 메서드가 있습니다.

public async Task<string> GenerateCodeAsync()
{
    string code = await GenerateCodeService.GenerateCodeAsync();
    return code;
}

이 메서드는 동기 메서드에서 호출해야합니다.

이 작업을 동 기적으로 수행하려면 GenerateCodeAsync 메서드를 복제하지 않고 어떻게해야합니까?

최신 정보

그러나 합리적인 해결책은 발견되지 않았습니다.

그러나, 나는 HttpClient 이미이 패턴을 구현하고 있음을 알았다.

using (HttpClient client = new HttpClient())
{
    // async
    HttpResponseMessage responseAsync = await client.GetAsync(url);

    // sync
    HttpResponseMessage responseSync = client.GetAsync(url).Result;
}



동기 메서드에서이 메서드를 호출해야합니다.

GenerateCodeAsync().Result 또는 GenerateCodeAsync().Wait() 다른 답변에서와 같이 GenerateCodeAsync().Wait() 하십시오. GenerateCodeAsync 가 완료 될 때까지 현재 스레드가 차단됩니다.

그러나 질문에 asp.net 태그가 지정되어 있으며 주석도 남겨 둡니다.

나는 더 간단한 코드를 작성하는 것보다 asp.net이 이것을 훨씬 쉽게 처리 할 수 ​​있다고 생각했다.

내 요점은 ASP.NET에서 비동기 메서드를 차단해서는 안됩니다 . 이렇게하면 웹 응용 프로그램의 확장 성이 AspNetSynchronizationContext 교착 상태가 발생할 수 있습니다 ( GenerateCodeAsync 내의 연속이 AspNetSynchronizationContext 게시 될 때). Task.Run(...).Result 를 풀 스레드로 오프로드하여 차단하면 주어진 HTTP 요청을 처리하는 데 +1 스레드가 추가되므로 확장 성이 더욱 악화됩니다.

ASP.NET에는 비동기 컨트롤러 (ASP.NET MVC 및 Web API의 비동기 컨트롤러)를 통해 또는 고전 ASP.NET의 AsyncManagerPageAsyncTask 를 통해 직접 비동기 메서드에 대한 지원 기능이 내장되어 있습니다. 당신이 그것을 사용해야합니다. 자세한 내용은 이 답변을 확인 하십시오 .




Related