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가 끝나면 그 이후의 처리를 계속 합니다.
비동기 프로그래밍하기 위해서 알아야되는 내용이지만, 처음 듣게 된다면 어렵습니다. 그래서 아래 표와 코드를 보시면 더욱 쉽게 이해하실 수 있습니다.
- Caller 라는 메서드가 호출되고, 문장1번이 실행됩니다.
- MyMethodAsync 메서드를 호출합니다. (메서드 이름에 Async를 붙여 명시적으로 비동기 메서드 표시)
- MyMethodAsync 메서드의 문장2번이 실행됩니다. (await를 만나기전까지요)
- await를 만났으면 MyMethodAsync를 호출했던 그곳으로 리턴됩니다.
- 그리고 ⓐ, (ⓑ, 문장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 호출할때 비동기 프로그래밍이 많아 사용되고 있기 때문에, 꼭 숙지하고 넘어가야되는 키워드라고 생각됩니다.
'개발 > C#' 카테고리의 다른 글
[C#] override VS new 재정의 사용 방법(feat. virtual, abstract) (12) | 2019.10.04 |
---|---|
[C#] 익명 타입(Anonymous Type) 이란? (3) | 2019.10.01 |
[C#] 연산자 오버로드 (10) | 2019.08.22 |
[C#] Indexer 란? 무엇인가. (0) | 2019.08.14 |
[C#] 확장메서드 (Extension Method) (2) | 2019.08.02 |