포스트

[C#] async 및 await를 사용한 비동기 프로그래밍

async 한정자

이번 포스트에서는 비동기와 병렬에서 설명한 비동기를 C#에서 직접 사용해 보겠습니다.

C# 에서는 비동기 프로그래밍을 위해 async 한정자와 await 키워드가 존재합니다.

C# 컴파일러가 async 한정자를 만나면 반환을 기다리지 않고 다음 다음 코드를 실행할 수 있도록 컴파일합니다.

async 한정자를 사용하는 메서드는 반드시 반환 형식이 **Task, Task, void** 형식이어야 한다는 제약 조건이 있습니다.

Task, Task 형식은 작업 완료까지 기다리는 메서드인 경우 사용하고

void 형식은 실행하고 반환이 필요 없는 메서드에서 사용하면 됩니다.

제가 작성한 반환이 필요 없는 메서드의 예시로는 현재 진행중인 개인 프로젝트에서 C#을 이용한 비동기 함수가 있습니다.

1
2
3
4
5
6
7
async void worker_thread()
{
    while(true)
    {
        // 비동기로 실행할 코드 내용
    }
}

이 함수의 경우, 서버의 시작부터 종료까지 반복해서 클라이언트의 요청을 처리하는 메서드이므로

메서드의 반환 형식이 void로 되어있습니다.


await 키워드

비동기 실행을 위해서는 async 한정자 외에도 await 키워드가 필요합니다.

만약 async 한정자를 사용하는 메서드 내부에 await 키워드가 없는 경우

해당 메서드는 호출자에게 제어권을 넘겨주지 않으므로 동기적으로 실행되게 됩니다.

단, void 반환 형식에서는 await 키워드가 없어도 비동기로 실행됩니다.


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
private static async Task<Toast> ToastBreadAsync(int slices)
{
    // ...

    return new Toast(); // Task<TResult> 반환 형식
}

static async Task<Toast> MakeToastWithButterAndJamAsync(int number)
{
    var toast = await ToastBreadAsync(number);
    ApplyButter(toast);
    ApplyJam(toast);

    return toast;       // Task<TResult> 반환 형식
}

static async Task Main(string[] args)
{
    // ...
    
    var toastTask = MakeToastWithButterAndJamAsync(2);
    var toast = await toastTask;        // 실행 결과를 받습니다.
    Console.WriteLine("toast is ready");
    // ...
    
    Console.WriteLine("Breakfast is ready!");
}


참고 및 코드 출처

MS C# 공식 문서

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.