본문 바로가기
카테고리 없음

C# Task와 Background Task 차이점 및 활용 방법

by tasiklee 2025. 2. 28.

1. Task와 Background Task의 차이점

C#에서 비동기 작업을 처리할 때 가장 많이 사용되는 개념이 Task입니다. 하지만 특정 시나리오에서는 Background Task도 활용됩니다. 이 두 가지 개념의 차이점을 이해하면 더욱 효과적으로 비동기 프로그래밍을 구현할 수 있습니다.

Task란?

Task는 .NET에서 제공하는 대표적인 비동기 실행 단위입니다. 여러 개의 작업을 병렬로 실행하고, 작업이 완료될 때까지 기다리거나, 작업이 끝난 후 추가 작업을 실행하는 등의 기능을 제공합니다.

Background Task란?

Background Task는 백그라운드에서 실행되는 작업을 의미하며, 보통 서비스에서 장기간 실행되는 작업이나, UI의 응답성을 유지하기 위해 사용됩니다. Task와 마찬가지로 비동기적으로 실행되지만, 애플리케이션 라이프사이클과 연계될 수도 있습니다.

2. Task의 특징 및 활용 방법

2.1 Task의 기본 특징

  • System.Threading.Tasks.Task 클래스 사용
  • 비동기 작업을 수행하고, 실행 완료 후 await로 결과를 받아올 수 있음
  • 병렬 실행을 지원하며, Task.Run()을 사용하여 새로운 작업을 시작할 수 있음
  • ContinueWith()를 사용하여 후속 작업을 지정할 수 있음
  • Task.WhenAll(), Task.WhenAny()를 활용하여 여러 작업을 동시에 실행 가능

2.2 Task의 활용 예제

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Task<int> task = Task.Run(() =>
        {
            Task.Delay(2000).Wait();
            return 42;
        });
        
        Console.WriteLine("작업 진행 중...");
        int result = await task;
        Console.WriteLine($"작업 완료: 결과는 {result}");
    }
}

3. Background Task의 특징 및 활용 방법

3.1 Background Task의 기본 특징

  • 보통 IHostedService 인터페이스를 구현하여 사용
  • 장기간 실행되는 작업을 처리하기 위해 BackgroundService를 확장하여 활용
  • ASP.NET Core 애플리케이션에서 백그라운드 프로세스를 관리하는 데 적합
  • 애플리케이션이 종료될 때 함께 종료됨

3.2 Background Task의 활용 예제

using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;

public class MyBackgroundService : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            Console.WriteLine("백그라운드 작업 실행 중...");
            await Task.Delay(1000, stoppingToken);
        }
    }
}

위 코드는 백그라운드에서 지속적으로 실행되는 서비스입니다. ExecuteAsync 메서드 내에서 무한 루프를 실행하며, stoppingToken을 사용하여 안전하게 종료할 수 있도록 합니다.

4. Task와 Background Task의 차이점 정리

실행 방식 비동기 작업 실행 지속적인 백그라운드 실행
주 사용처 UI 비동기 처리, 병렬 작업 장기간 실행되는 서비스
관리 방식 Task.Run(), async/await IHostedService, BackgroundService
종료 방식 작업 완료 시 종료 애플리케이션 종료 시 함께 종료

5. Task 외의 다른 쓰레드 관련 개념

5.1 Thread

C#에서는 System.Threading.Thread를 사용하여 직접 쓰레드를 생성할 수 있습니다. 하지만 Task보다 관리가 어렵고, 리소스 사용량이 많기 때문에 보통 Task를 선호합니다.

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Thread thread = new Thread(() =>
        {
            Thread.Sleep(2000);
            Console.WriteLine("새로운 쓰레드 실행 완료!");
        });
        thread.Start();
        Console.WriteLine("메인 스레드 실행 중...");
    }
}

5.2 ThreadPool

ThreadPool은 여러 개의 쓰레드를 미리 만들어 놓고 재사용하는 방식으로 동작합니다. Task 내부적으로도 ThreadPool을 사용합니다.

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        ThreadPool.QueueUserWorkItem(state =>
        {
            Thread.Sleep(2000);
            Console.WriteLine("ThreadPool 작업 완료!");
        });
        Console.WriteLine("메인 스레드 실행 중...");
    }
}

6. 결론

C#에서 비동기 작업을 수행하는 방법에는 여러 가지가 있지만, 가장 일반적으로 사용되는 것이 TaskBackground Task입니다.

  • Task는 단기적인 비동기 작업을 수행하는 데 적합하며, UI 응답성 개선이나 병렬 실행을 위해 사용됩니다.
  • Background Task는 애플리케이션이 실행되는 동안 지속적으로 실행되는 작업을 관리하는 데 적합합니다.
  • 기존 ThreadThreadPool도 사용 가능하지만, 최신 C#에서는 Task 기반의 비동기 프로그래밍이 권장됩니다.

이 글이 C#에서 비동기 작업을 구현하는 데 도움이 되길 바랍니다! 😊