반응형
TAP(Task-based Asynchronous Pattern)이란?
TAP(Task-based Asynchronous Pattern)은 .NET Framework 4.5에서 비동기 프로그래밍을 단순화하기 위해 도입된 패턴이다. TAP은 Task 및 Task<TResult> 클래스를 기반으로 비동기 작업을 처리하며, async / await 키워드와 함께 사용된다.
이전 포스팅에서 알아본 APM의 상위호환이라고 생각하면 된다. TAP은 C#에서 현대적인 비동기 프로그래밍의 표준 패턴으로 자리 잡았다. C# 프로그래머라면 APM말고 TAP을 적극 활용하도록 하자.
TAP의 주요 특징
- Task 단위의 비동기 작업 관리 : TAP은 작업의 상태를 추적하고 결과를 반환하며, 작업이 완료되면 후속 작업을 실행한다.
- async / await 키워드 지원 : async 키워드로 비동기 메서드를 정의하고, await를 사용하여 비동기 작업이 완료될 때까지 대기한다. 코드가 동기 방식과 흐름이 동일하기 때문에 가독성이 향상된다.
- 비동기 작업 연결 : Task 체인을 통해 여러 작업을 순차적 또는 병렬로 처리할 수 있다.
- 에러 처리 : try-catch 블록과 결합하여 비동기 작업에서 발생한 예외를 처리할 수 있다.
예제로 알아보는 TAP
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.WriteLine("작업 시작");
// 비동기 메서드 호출
await DoSomethingAsync();
Console.WriteLine("작업 완료");
}
static async Task DoSomethingAsync()
{
Console.WriteLine("작업 중...");
await Task.Delay(2000); // 2초 대기 (비동기)
Console.WriteLine("작업 중 완료!");
}
}
결과를 반환하는 예제
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.WriteLine("계산 시작");
int result = await CalculateAsync(5, 10);
Console.WriteLine($"계산 결과: {result}");
}
static async Task<int> CalculateAsync(int a, int b)
{
await Task.Delay(1000); // 1초 대기
return a + b;
}
}
비동기 작업 체이닝
1단계부터 차례대로 작업이 진행된다.
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.WriteLine("작업 체인 시작");
int result = await FirstStepAsync()
.ContinueWith(task => SecondStepAsync(task.Result).Result) // 첫 번째 작업 결과를 기반으로 두 번째 작업 실행
.ContinueWith(task => ThirdStepAsync(task.Result).Result); // 두 번째 작업 결과를 기반으로 세 번째 작업 실행
Console.WriteLine($"최종 결과: {result}");
}
static Task<int> FirstStepAsync()
{
return Task.Run(() => {
Task.Delay(1000).Wait(); // 1초 대기
Console.WriteLine("1단계 완료");
return 10;
});
}
static Task<int> SecondStepAsync(int input)
{
return Task.Run(() => {
Task.Delay(1000).Wait(); // 1초 대기
Console.WriteLine("2단계 완료");
return input * 2;
});
}
static Task<int> ThirdStepAsync(int input)
{
return Task.Run(() => {
Task.Delay(1000).Wait(); // 1초 대기
Console.WriteLine("3단계 완료");
return input + 5;
});
}
}
TAP의 장점
- 가독성 : async / await 키워드를 사용하여 동기 코드처럼 읽을 수 있어 가독성이 뛰어남.
- 비동기 작업의 유연성 : 비동기 작업의 상태를 쉽게 추척할 수 있으며, 여러 작업을 병렬 또는 순차적으로 실행할 수 있음
- 코드 관리의 용이성 : APM이나 EAP(Event-based Asynchronous Pattern)와 비교해 콜백 중첩이 줄어들어 코드 관리가 쉬움
TAP의 단점
- 컨텍스트 전환 비용 : await를 사용하면 기본적으로 작업이 완료된 후 호출 스레드의 컨텍스트로 복귀하려 합니다. 컨텍스트 전환은 성능에 영향을 줄 수 있다.
- 데드락 : UI 스레드나 싱글 스레드 환경에서 async 메서드의 결과를 동기로 기다리면 데드락이 발생할 수 있다.
- 잘못된 비동기 작업 병렬화 : 비동기 작업을 병렬로 실행하려면 Task.WhenAll 등을 명시적으로 사용해야 한다. 그렇지 않으면 순차적으로 실행된다.
// 병렬 실행
await Task.WhenAll(Task1(), Task2());
다른 비동기 모델들과의 비교
함께 읽으면 좋은 글
참고 사이트
'프로그래밍 > C#' 카테고리의 다른 글
C# 표현식 본체 멤버와 암시적 연산자 함께 사용하기 (0) | 2024.12.06 |
---|---|
C# 문자열 비교하기 ==연산자 vs Equlas() 메서드 (0) | 2024.11.27 |
C# 비동기 프로그래밍 APM이란 무엇인가? (0) | 2024.11.21 |
C# 프로그램 진입점 Main함수가 static인 이유 (1) | 2024.11.19 |
C# 비동기 프로그래밍 시작하기 (0) | 2024.10.08 |
댓글