Main에서 직접 비동기 메서드 호출: 종합 가이드
C#에 도입된 중요한 개선 사항 중 하나는 비동기/대기 패턴입니다. 비동기 작업의 개발을 단순화합니다. 그러나 Main()에서 직접 비동기 메서드를 호출하는 것은 약간 까다로울 수 있습니다.
문제를 이해하려면 다음 코드 샘플을 고려하세요.
public class test { public async Task Go() { await PrintAnswerToLife(); Console.WriteLine("done"); } public async Task PrintAnswerToLife() { int answer = await GetAnswerToLife(); Console.WriteLine(answer); } public async Task<int> GetAnswerToLife() { await Task.Delay(5000); int answer = 21 * 2; return answer; } }
Go 메서드를 호출하려는 경우 Main()에서 다음과 같이:
class Program { static void Main(string[] args) { test t = new test(); t.Go().GetAwaiter().OnCompleted(() => { Console.WriteLine("finished"); }); Console.ReadKey(); } }
교착 상태 상황이 발생하여 출력이 표시되지 않을 수 있습니다.
해결책은 Main()을 비동기 메서드 자체로 수정하는 데 있습니다. C# 7.1 버전 이상:
static async Task Main(string[] args) { test t = new test(); await t.Go(); Console.WriteLine("finished"); Console.ReadKey(); }
이 접근 방식을 사용하면 메인 스레드를 차단하지 않고 비동기 작업을 원활하게 실행할 수 있습니다.
이전 버전의 C#을 사용하는 경우 , 다음 코드를 사용할 수 있습니다.
static void Main(string[] args) { test t = new test(); t.Go().Wait(); Console.WriteLine("finished"); Console.ReadKey(); }
여기에서 Wait() 메서드는 Go 메서드가 실행될 때까지 기본 스레드를 명시적으로 차단합니다. 완료됩니다.
비동기/대기 패턴을 수용하면 콜백의 복잡성을 피할 수 있으므로 비동기 작업을 위한 더 깔끔하고 유지 관리하기 쉬운 코드를 얻을 수 있습니다.
위 내용은 C#의 기본 메서드에서 비동기 메서드를 어떻게 올바르게 호출해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!