7년차 개발자인 저는 ASP.NET Web Form 만 알고 개발을 하고 있었습니다.

최근에 ASP.NET MVC 및 .Net Framework 기반이 아닌 .Net Core MVC를 공부하다보니 async/await 키워드를 많이 보게 되어서 정리해보려고 합니다.

 

async/await

C# 5.0부터 async/await 라는 키워드가 도입되어 비동기 프로그래밍을 더 쉽게 할 수 있게 되었습니다. 이 두개의 키워드를 사용하면 Task 클래스를 이용한 비동기 처리를 더욱 간단히 구현할 수 있습니다.

 

  • async 키워드가 반환형 앞에 붙어 있습니다.
  • async로 수식된 메서드는 비동기 메서드가 됩니다.
  • async 키워드를 지정하고, 반환값이 없을 경우 Task 형으로 지정하고 반환값이 있다면 Task<TResult>형으로 지정합니다. (void는 event handler에서만 가능합니다.)
  • 비동기 메서드 안에 await 키워드를 사용할 수 있습니다.
  • async 키워드로 수식되지 않은 메서드에서는 await 키워드를 이용할 수 없습니다.
  • await 키워드는 지정한 Task가 끝날 때까지 이후의 처리를 중단하고 지정한 Task가 끝나면 그 이후의 처리를 계속 합니다.

비동기 프로그래밍하기 위해서 알아야되는 내용이지만, 처음 듣게 된다면 어렵습니다. 그래서 아래 표와 코드를 보시면 더욱 쉽게 이해하실 수 있습니다.

 

 

 

  1. Caller 라는 메서드가 호출되고, 문장1번이 실행됩니다.
  2. MyMethodAsync 메서드를 호출합니다. (메서드 이름에 Async를 붙여 명시적으로 비동기 메서드 표시)
  3. MyMethodAsync 메서드의 문장2번이 실행됩니다. (await를 만나기전까지요)
  4. await를 만났으면 MyMethodAsync를 호출했던 그곳으로 리턴됩니다.
  5. 그리고 ⓐ, (ⓑ, 문장3번) 각기 다르게 순차적으로 실행됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
static void Main(string[] args) {
    Caller();
 
    Console.ReadLine(); // 종료방지
}
 
async static private void MyMethodAsync() {
    Console.WriteLine("async start");
 
    await Task.Run(() => {
        for(var i = 0; i < 10; i++) {
            Console.WriteLine("await ing...");
        }
    });
 
    for(var i = 0; i < 10; i++) {
        Console.WriteLine("async end");
    }
}
static void Caller() {
    Console.WriteLine("main start");
 
    MyMethodAsync();
 
    for (var i = 0; i < 10; i++) {
        Console.WriteLine("main end");
    }
}
}
cs

 

위의 설명을 코드로 작성하였습니다.

 

 

테스트한 결과를 보니, Caller 메서드에서 비동기 메서드인 MyMethodAsync를 호출하고 난 다음, await 키워드를 만났을때부터 각기 다르게 실행됩니다. 결과에서는 main end 로그를 다 찍히고, await ing, async end 로그가 찍혔지만 이거는 순서가 테스트할때마다 달라졌습니다.

.Net Core MVC에서는 DB 호출할때 비동기 프로그래밍이 많아 사용되고 있기 때문에, 꼭 숙지하고 넘어가야되는 키워드라고 생각됩니다.

 

 

 

+ Recent posts