본문 바로가기
프로그래밍/c#

c# 비동기 프로그래밍 async, await

by 지나팩 2024. 10. 1.

C#에서 async와 await 키워드는 비동기 프로그래밍(Asynchronous Programming)을 지원하기 위한 핵심 요소입니다. 이 키워드들을 사용하면 비동기 작업을 쉽게 작성하고 관리할 수 있습니다. 이를 위해선 동기와 비동기에 대한 기본적인 이해가 필요합니다. 

 

 

프로그래밍 동기와 비동기

동기와 비동기에 대해선 프로그래밍을 배워본 사람이라면 그 개념을 잘 모르더라도 한번쯤은 들어봤을 단어일 것입니다. 저 역시도 계속 들어왔던 단어지만 그 개념은 아예 모르고 있었으니 말

ks-factory.tistory.com

async

메서드나 람다 표현식에 사용되어 비동기 작업을 정의할 수 있게 합니다.

 

  • async 키워드는 메서드 선언에 사용됩니다.
  • async 메서드는 Task 또는 Task<T> 반환형을 가집니다. 반환형이 void일 수도 있지만, 이는 주로 이벤트 핸들러에서 사용됩니다.

await

메서드 내에서 비동기 작업이 완료될 때까지 기다리게 합니다.

  • await 키워드는 async 메서드 내에서 비동기 작업을 기다릴 때 사용됩니다.
  • 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
using System;
using System.Net.Http;
using System.Threading.Tasks;
 
class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("Fetching data from the web...");
        string data = await FetchDataFromWebAsync();
        Console.WriteLine("Data fetched: " + data);
    }
 
    static async Task<string> FetchDataFromWebAsync()
    {
        using (HttpClient client = new HttpClient())
        {
            // 비동기적으로 데이터를 가져옴
            HttpResponseMessage response = await client.GetAsync("https://jsonplaceholder.typicode.com/posts/1");
            response.EnsureSuccessStatusCode();
 
            // 비동기적으로 응답 내용을 문자열로 읽음
            string responseData = await response.Content.ReadAsStringAsync();
            return responseData;
        }
    }
}
cs

 

코드 설명

  1. Main 메서드:
    • Main 메서드는 비동기 작업을 지원하기 위해 async로 정의되어 있으며, Task를 반환합니다.
    • FetchDataFromWebAsync 메서드를 await 키워드를 사용해 호출함으로써, 해당 작업이 완료될 때까지 비동기적으로 기다립니다.
  2. FetchDataFromWebAsync 메서드:
    • 이 메서드는 웹에서 데이터를 가져오는 비동기 작업을 수행합니다.
    • HttpClient 객체를 사용해 비동기적으로 GetAsync 메서드를 호출하여 데이터를 가져옵니다.
    • 데이터를 가져온 후, ReadAsStringAsync 메서드를 사용해 응답 내용을 문자열로 비동기적으로 읽습니다.
  3. await:
    • await는 HttpClient.GetAsync와 HttpContent.ReadAsStringAsync 메서드가 비동기적으로 완료될 때까지 대기하지만, 이 대기 동안 메인 스레드는 차단되지 않습니다.

 

 주의사항

  • async 메서드 내부에서 반드시 await를 사용해야 하는 것은 아니지만, await를 사용하지 않으면 해당 메서드는 동기적으로 동작하게 되어 비동기의 이점을 활용할 수 없습니다.
  • await는 Task 또는 Task<T>를 반환하는 메서드에만 사용할 수 있습니다.

비동기 작업의 흐름

  • FetchDataFromWebAsync가 호출되면 GetAsync와 ReadAsStringAsync는 즉시 실행되지만, 작업이 완료될 때까지 기다리지 않고 호출한 코드로 제어가 반환됩니다.
  • 작업이 완료되면 await는 대기 상태에서 깨어나 결과를 반환받아 다음 작업을 이어나갑니다.

비동기 프로그래밍을 통해 프로그램이 응답성을 유지하고, 특히 UI 프로그램에서는 사용자 경험을 크게 향상시킬 수 있습니다.

댓글