1. 개념 설명
Task는 비동기 작업을 표현하고, Task<T>는 결과 값을 반환하는 비동기 작업입니다. async/await를 사용하면 콜백 없이 비동기 흐름을 동기 코드처럼 읽기 쉽게 작성할 수 있습니다. Task는 스레드 그 자체가 아니라 스케줄러가 실행하는 작업의 약속이며, 완료/예외/취소 상태를 가집니다.
2. 코드 예제
아래 예제는 Task와 Task<T>를 함께 사용하고, 여러 작업을 Task.WhenAll로 묶어 기다립니다. 콘솔에 진행 상황을 출력해 동작을 확인합니다.
using System;
using System.Threading.Tasks;
static async Task DoWorkAsync(string name, int delayMs)
{
await Task.Delay(delayMs);
Console.WriteLine($"{name} 완료");
}
static async Task<int> GetValueAsync()
{
await Task.Delay(300);
return 42;
}
Console.WriteLine("시작");
Task t = DoWorkAsync("작업A", 500);
Task<int> tv = GetValueAsync();
int value = await tv; // Task<T> 결과
await t; // Task 완료 대기
Console.WriteLine($"값: {value}");
Task[] batch =
{
DoWorkAsync("B1", 200),
DoWorkAsync("B2", 400),
DoWorkAsync("B3", 100)
};
await Task.WhenAll(batch);
Console.WriteLine("모든 작업 완료");
실행하면 "시작" 이후 값과 각 작업의 완료 메시지가 출력되고, 마지막에 "모든 작업 완료"가 표시됩니다. 지연 시간에 따라 출력 순서는 달라질 수 있습니다.
3. 주의사항/팁
UI/ASP.NET 컨텍스트에서는 .Result/.Wait() 사용이 데드락을 유발할 수 있어 피하고 await를 사용합니다. 예외는 await 시 전파되므로 try/catch로 감싸고, 취소는 CancellationToken을 전달해 처리합니다. CPU 바운드 작업만 Task.Run으로 넘기고, I/O는 해당 API의 비동기 메서드를 직접 await하는 것이 좋습니다.
'C#' 카테고리의 다른 글
| C# Span<T>과 Memory<T> (0) | 2026.04.07 |
|---|---|
| C# Switch 표현식 (Switch Expression) (0) | 2026.04.07 |
| C# JSON 직렬화 System.Text.Json (0) | 2026.04.06 |
| C# 파일 읽기/쓰기 (File I/O) (0) | 2026.04.03 |
| C# 예외 처리 try-catch-finally (0) | 2026.04.03 |