본문 바로가기
프로그래밍/C#

C# 비동기 프로그래밍 TAP이란 무엇인가?

by bantomak 2024. 11. 22.
반응형

TAP(Task-based Asynchronous Pattern)이란?

TAP(Task-based Asynchronous Pattern)은 .NET Framework 4.5에서 비동기 프로그래밍을 단순화하기 위해 도입된 패턴이다. TAP은 Task 및 Task<TResult> 클래스를 기반으로 비동기 작업을 처리하며, async / await 키워드와 함께 사용된다.

 

 

C# 비동기 프로그래밍 APM이란 무엇인가?

APM(Asynchronous Programming Model)이란?APM(Asynchronous Programming Model)은 C#에서 비동기 작업을 구현하는 모델로, .NET Framework에서 도입되었다. 비동기 패턴으로 동작하며, 주로 Begin 혹은 End 이름으로 시작하

jettstream.tistory.com

이전 포스팅에서 알아본 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# 비동기 프로그래밍 APM이란 무엇인가?

APM(Asynchronous Programming Model)이란?APM(Asynchronous Programming Model)은 C#에서 비동기 작업을 구현하는 모델로, .NET Framework에서 도입되었다. 비동기 패턴으로 동작하며, 주로 Begin 혹은 End 이름으로 시작하

jettstream.tistory.com

참고 사이트

 

TAP(작업 기반 비동기 패턴): 소개 및 개요 - .NET

TAP(작업 기반 비동기 패턴)에 대해 알아보고 이를 레거시 패턴인 APM(비동기 프로그래밍 모델) 및 EAP(이벤트 기반 비동기 패턴)와 비교합니다.

learn.microsoft.com

댓글