C#에서 async와 await 키워드는 비동기 프로그래밍(Asynchronous Programming)을 지원하기 위한 핵심 요소입니다. 이 키워드들을 사용하면 비동기 작업을 쉽게 작성하고 관리할 수 있습니다. 이를 위해선 동기와 비동기에 대한 기본적인 이해가 필요합니다.
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 |
코드 설명
- Main 메서드:
- Main 메서드는 비동기 작업을 지원하기 위해 async로 정의되어 있으며, Task를 반환합니다.
- FetchDataFromWebAsync 메서드를 await 키워드를 사용해 호출함으로써, 해당 작업이 완료될 때까지 비동기적으로 기다립니다.
- FetchDataFromWebAsync 메서드:
- 이 메서드는 웹에서 데이터를 가져오는 비동기 작업을 수행합니다.
- HttpClient 객체를 사용해 비동기적으로 GetAsync 메서드를 호출하여 데이터를 가져옵니다.
- 데이터를 가져온 후, ReadAsStringAsync 메서드를 사용해 응답 내용을 문자열로 비동기적으로 읽습니다.
- await:
- await는 HttpClient.GetAsync와 HttpContent.ReadAsStringAsync 메서드가 비동기적으로 완료될 때까지 대기하지만, 이 대기 동안 메인 스레드는 차단되지 않습니다.
주의사항
- async 메서드 내부에서 반드시 await를 사용해야 하는 것은 아니지만, await를 사용하지 않으면 해당 메서드는 동기적으로 동작하게 되어 비동기의 이점을 활용할 수 없습니다.
- await는 Task 또는 Task<T>를 반환하는 메서드에만 사용할 수 있습니다.
비동기 작업의 흐름
- FetchDataFromWebAsync가 호출되면 GetAsync와 ReadAsStringAsync는 즉시 실행되지만, 작업이 완료될 때까지 기다리지 않고 호출한 코드로 제어가 반환됩니다.
- 작업이 완료되면 await는 대기 상태에서 깨어나 결과를 반환받아 다음 작업을 이어나갑니다.
비동기 프로그래밍을 통해 프로그램이 응답성을 유지하고, 특히 UI 프로그램에서는 사용자 경험을 크게 향상시킬 수 있습니다.
'프로그래밍 > c#' 카테고리의 다른 글
C# 지역 함수?? 지역 함수의 예제와 활용 (0) | 2024.11.05 |
---|---|
c# 확장 메소드(Extension Method)?? 확장 메소드란 무엇인가? 사용방법과 예제 (4) | 2024.11.04 |
c# 튜플? Tuple? (0) | 2024.08.01 |
c# 인덱서? Indexer? 인덱서의 특징과 예제 (0) | 2024.05.03 |
c# LINQ?? LINQ의 특징과 예제 (0) | 2024.04.16 |
댓글