c#

C# 비동기 프로그래밍: async/await와 Task 활용

개발에대해 2025. 9. 21. 22:01

C# 비동기 프로그래밍: async/await와 Task 활용

애플리케이션 개발에서 비동기 프로그래밍(Asynchronous Programming)은 필수입니다.

C#에서는 async/await 키워드와 Task, Thread를 활용하여 비동기 작업을 쉽게 구현할 수 있습니다.

UI 응답성을 유지하고, 서버 요청 처리나 병렬 작업을 효율적으로 수행하는 방법을 예제와 함께 살펴보겠습니다.

 

1. 비동기 프로그래밍 기본 개념

비동기 프로그래밍은 코드 실행을 블로킹(blocking) 하지 않고, 다른 작업을 동시에 수행할 수 있도록 합니다.

C#에서는 주로 다음과 같이 구현합니다:

  • Thread: 직접 스레드를 생성하여 병렬 실행
  • Task: 스레드를 추상화한 단위 작업, ThreadPool 활용
  • async/await: 비동기 메서드를 쉽게 작성하고 가독성 유지

 

2. Task와 async/await 예제

 

서버 요청이나 파일 I/O와 같은 시간이 걸리는 작업을 비동기적으로 처리할 수 있습니다.


using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program {
    static async Task Main(string[] args) {
        Console.WriteLine("요청 시작...");
        string result = await GetDataAsync("https://jsonplaceholder.typicode.com/todos/1");
        Console.WriteLine("요청 결과: " + result);
    }

    static async Task<string> GetDataAsync(string url) {
        using (HttpClient client = new HttpClient()) {
            string response = await client.GetStringAsync(url);
            return response;
        }
    }
}
  

 

위 예제에서 `GetDataAsync` 메서드는 HTTP 요청을 비동기적으로 수행하고, UI나 다른 코드 실행을 막지 않습니다.

 

3. UI 응답성을 위한 비동기 처리

 

Windows Forms, WPF 등 UI 환경에서는 메인 스레드가 블로킹되면 UI가 멈춥니다.

async/await를 활용하면, UI가 멈추지 않고 백그라운드에서 작업을 수행할 수 있습니다.


// WPF 버튼 클릭 이벤트 예제
private async void Button_Click(object sender, RoutedEventArgs e) {
    ProgressBar.Visibility = Visibility.Visible;
    string data = await GetDataAsync("https://jsonplaceholder.typicode.com/todos/1");
    TextBox.Text = data;
    ProgressBar.Visibility = Visibility.Hidden;
}

 

4. 병렬 처리와 ThreadPool

 

Task를 사용하면 ThreadPool 기반으로 쉽게 병렬 작업을 처리할 수 있습니다.

CPU 연산, 데이터 처리, API 요청 등을 병렬로 실행하여 성능을 높일 수 있습니다.


var tasks = new List<Task>();
for (int i = 1; i <= 5; i++) {
    int index = i;
    tasks.Add(Task.Run(() => {
        Console.WriteLine($"{index}번 작업 실행: " + DateTime.Now);
        Task.Delay(1000).Wait(); // 시간 소요 작업
    }));
}
await Task.WhenAll(tasks);
Console.WriteLine("모든 작업 완료");

 

5. 실무 활용 팁

  • I/O 작업: 파일, DB, 웹 요청 등에서 async/await 활용
  • UI 작업: 메인 스레드 블로킹 방지 → ProgressBar, Loading 표시 가능
  • Task 병렬 처리: CPU 바운드 작업은 Task.Run, 데이터 병렬 처리에 적합
  • 예외 처리: async 메서드 내부 예외는 try/catch로 처리, Task 예외는 Task.WhenAll로 집계
  • CancellationToken: 작업 취소 및 타임아웃 처리 가능

 

마무리

C# 비동기 프로그래밍은 UI 응답성 유지와 서버 요청, 병렬 연산 처리에서 필수 기술입니다.

async/await, Task, Thread를 적절히 활용하면 코드 가독성과 유지보수성을 높이면서 성능도 개선할 수 있습니다.

실무에서는 I/O 중심 작업, CPU 연산 병렬화, UI 동작 개선, 서버 API 호출 등 다양한 시나리오에 적용 가능합니다.

반응형