본문 바로가기

C#

C# Task와 Task<T> 사용법

1. 개념 설명

Task는 비동기 작업을 표현하고, Task<T>는 결과 값을 반환하는 비동기 작업입니다. async/await를 사용하면 콜백 없이 비동기 흐름을 동기 코드처럼 읽기 쉽게 작성할 수 있습니다. Task는 스레드 그 자체가 아니라 스케줄러가 실행하는 작업의 약속이며, 완료/예외/취소 상태를 가집니다.

2. 코드 예제

아래 예제는 TaskTask<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