1. 개념 설명
async/await는 비동기 작업을 선언적으로 표현해 I/O 대기 시간을 효율적으로 처리합니다. 메서드를 async로 표시하고 Task/Task<T>를 반환하며, await는 현재 스레드를 차단하지 않고 작업이 완료되면 이어서 실행합니다. 이를 통해 UI 응답성을 유지하고 서버에서 더 많은 동시 요청을 처리할 수 있습니다.
2. 코드 예제
아래 예제는 웹 페이지 문자열 길이와 인위적 딜레이 작업을 동시에 시작한 뒤 결과를 출력합니다.
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task<int> FetchLengthAsync()
{
using var client = new HttpClient();
var content = await client.GetStringAsync("https://example.com");
return content.Length;
}
static async Task<string> DelayMsgAsync()
{
await Task.Delay(500);
return "딜레이 완료";
}
static async Task Main()
{
Console.WriteLine("시작");
var lengthTask = FetchLengthAsync();
var msgTask = DelayMsgAsync();
await Task.WhenAll(lengthTask, msgTask);
Console.WriteLine($"메시지: {msgTask.Result}, 길이: {lengthTask.Result}");
Console.WriteLine("끝");
}
}
두 작업을 먼저 시작한 뒤 Task.WhenAll로 모두 완료되기를 기다립니다. await는 대기 중 스레드를 점유하지 않아 Console 앱에서도 다른 작업을 진행할 수 있습니다.
3. 주의사항/팁
이벤트 핸들러 외에는 async void를 피하고 Task를 반환하도록 설계합니다. 예외는 await 시 전파되므로 try/catch로 감싸고 필요하면 CancellationToken을 적용합니다. 라이브러리 코드에서는 ConfigureAwait(false)를 고려하고, 독립적인 작업은 Task.WhenAll로 병렬 시작이 성능에 유리합니다.
'C#' 카테고리의 다른 글
| C# 레코드 타입 (Record) (0) | 2026.03.27 |
|---|---|
| C# 패턴 매칭 (Pattern Matching) (0) | 2026.03.26 |
| C# LINQ 기초 - Where, Select, OrderBy (0) | 2026.03.26 |
| C# 문자열 보간법 (String Interpolation) (0) | 2026.03.25 |
| 폴더 생성하기 (0) | 2021.10.19 |