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 호출 등 다양한 시나리오에 적용 가능합니다.
'c#' 카테고리의 다른 글
C# 파일 입출력과 JSON/XML 처리 (0) | 2025.09.21 |
---|---|
C# 비동기 프로그래밍 : PLINQ, CancellationToken, 고급 Task 제어 (0) | 2025.09.21 |
C# LINQ 활용법 – 컬렉션 처리와 데이터 쿼리 (0) | 2025.09.21 |
C# WPF/WinForms GUI 개발: MVVM, 데이터 바인딩, 커스텀 컨트롤 활용 (0) | 2025.09.18 |
C# Entity Framework(Core)와 데이터베이스 연동 (1) | 2025.09.18 |