재우니의 블로그

c#7 의 비동기 Async Main 함수 적용해 보기


https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/


C # 언어로 작성할 수있는 프로그램에는 두 가지 종류가 있습니다. 하나는 엔트리 포인트가 있는 프로그램으로, 운영 체제가 프로그램을 로드하고 엔트리 포인트에서 실행할 수 있습니다. 또 하나는 진입 점이 없는 프로그램입니다. 

운영체제는 프로그램을 직접 실행할 수 없으며, 엔트리 포인트가있는 다른 프로그램에서 프로그램을 참조 할 수 있으며 코드를 실행할 수 있습니다.

진입 점이 있는 응용 프로그램 유형 : Windows Forms App, UWP App, 콘솔 응용 프로그램, WPF 응용 프로그램, ASP.NET 및 ASP.NET 핵심 응용 프로그램 및 Xamarian 응용 프로그램.

진입 점이 필요없는 응용 프로그램 유형 : 클래스 라이브러리 (/ t : lib), 모듈 (/ t : 모듈)


주요 방법

다른 언어와 마찬가지로 C # 프로그램은 Main 메서드로 시작 합니다. Main 메서드 의 유효한 시그니처로 간주되는 5 개의 오버로드가 있습니다.

public static void Main ();
public static int Main ();
public static void Main (string [] args);
public static int Main (string [] args);

C # 진입 점 메서드는 정적 이어야하며 메서드 이름은 Main 이어야하며, 이 메서드의 반환 형식은 void 또는 int 일 수 있습니다 . 명령 줄 인수(command-line arguments) 가 들어있는 문자열 배열의 매개 변수 1개를 가질 수 있습니다 .

진입 점이 int 를 반환 하면 값은 운영 체제 또는 이 진입 점으로 프로그램을 시작한 호스트 프로세스에 의해 평가 될 수 있습니다. 이 값은 실 생활에서 에서 널리 사용됩니다. 


비동기 기본 메소드

C #은 비동기 작업을 위해 읽기 쉬운 워크 플로우를 허용하는 버전 4.0 부터  async / await 패턴을 도입했습니다. 이러한 비동기 작업 (일명 비동기 프로그래밍 모델)을위한 기존의 많은 언어 구조가 새로운 async/await 키워드로 작업 할 수 있습니다. 오늘날 커뮤니티는 작업의 비동기 버전만을 제공하는 많은 라이브러리를 개발합니다. 
(예를 들어, System.Net.HttpClient , Microsoft.Azure.EventHub.Core. )


위에서 보았 듯이 진입 점 메서드에서 비동기 작업을 기다리고 싶다면 다음과 같은 진입 점 정의가 유효하지 않기 때문에 몇 가지 해결 방법을 적용해야 합니다.


public static async Task Main(string[] args) 
{
    await BuildWebHost(args).RunAsync();
}

image

이 문제를 해결하려면 기적으로 작업을 기다려야합니다.

public static void Main(string[] args)
{     
BuildWebHost(args).RunAsync().GetAwaiter().GetResult(); }

또는 Wait ()를 Task 객체에 호출 합니다.

public static void Main(string[] args)
{ BuildWebHost(args).RunAsync().Wait(); }


C # 7.1 에서 진입 점의 유효한 서명을 확장하여, Main 메서드의 이러한 비동기 오버로드를 유효하게합니다.

public static void Main(); public static int Main(); public static void Main(string[] args); public static int Main(string[] args);
public static Task Main();
public static Task<int> Main();
public static Task Main(string[] args);
public static Task<int> Main(string[] args);


Task-like 반환 유형은 entrypoint 메소드에서 async 수정자를 사용하여 키워드 await 활성화합니다 .

image


결론

비동기 Main 은 다른 비동기 메서드에서 실행되는 것과 같이 아무런 임시 조치없이 엔트리 포인트 메서드의 비동기 작업을 사용하기 쉽게 만듭니다. 컴파일 시점에 비동기 진입 점 메서드는 Task-like await 표현식에 대해 GetAwaitor (). GetResult () 메서드를 호출하도록 컴파일됩니다 

이 디자인은 이전 버전의 언어와 백엔드 호환성을 허용합니다. 자세한 내용을 보려면 Roslyn Git repo의 Async Main 을 참조하십시오 .