본문 바로가기
.NET

CancellationTokenSource 핵심 사용법

by leo21c 2026. 2. 25.

CancellationTokenSource는 신호를 생성하는 발생기이고, 여기서 파생된 CancellationToken은 작업을 멈춰야 한다는 소식을 듣는 수신기 역할을 합니다.

### 1. 기본적인 취소 흐름

작업을 시작할 때 토큰을 넘겨주고, 작업 내부에서 주기적으로 취소 요청 여부를 확인해야 합니다.

public async Task ProcessDeviceDataAsync()
{
    // 1. CTS 생성
    using (var cts = new CancellationTokenSource())
    {
        CancellationToken token = cts.Token;

        // 2. 비동기 작업 시작 (토큰 전달)
        Task workTask = DoCommunicationWork(token);

        // 예시: 사용자가 취소 버튼을 누르거나 특정 조건 발생 시
        // cts.Cancel(); 
    }
}

private async Task DoCommunicationWork(CancellationToken token)
{
    while (true)
    {
        // 3. 취소 요청이 있었는지 확인
        // 방법 A: 예외를 던져서 즉시 중단 (권장)
        token.ThrowIfCancellationRequested();

        // 장치와 통신 수행...
        await Task.Delay(1000, token); // 내장 비동기 메서드에도 토큰 전달
    }
}

 

### 2. 타임아웃 처리 (전력 장비 통신 필수)

장치로부터 응답이 없을 때 무한정 대기하지 않도록 시간 제한을 걸 수 있습니다.

// 5초 후 자동으로 취소 신호 발생
using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
{
    try 
    {
        await _deviceService.ReadSettingsAsync(cts.Token);
    }
    catch (OperationCanceledException)
    {
        // 타임아웃 또는 사용자 취소 처리
        Console.WriteLine("통신 시간이 초과되었습니다.");
    }
}

 

### 3. 여러 개의 CTS 결합 (Linked Source)

사용자 취소 요청과 시스템 타임아웃을 동시에 관리해야 할 때 유용합니다.

var userCancelCts = new CancellationTokenSource();
var timeoutCts = new CancellationTokenSource(10000);

// 두 토큰 중 하나만 취소되어도 취소됨
using (var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(userCancelCts.Token, timeoutCts.Token))
{
    await ExecuteTaskAsync(linkedCts.Token);
}

 

### 개발 실무 적용 팁

  • 반드시 using 사용: CancellationTokenSource는 내부적으로 커널 이벤트를 사용하므로 메모리 누수 방지를 위해 작업 완료 후 반드시 Dispose해야 합니다.
  • 협력적 취소(Cooperative Cancellation): Cancel()을 호출한다고 해서 작업이 강제로 종료되지 않습니다. 반드시 작업 내부에서 token.ThrowIfCancellationRequested()나 token.IsCancellationRequested를 통해 종료 로직을 구현해야 합니다.
  •  
  • MAUI 모바일 앱 적용: 업/다운로드 속도 저하 문제 해결을 위해 통신 루프 내에서 취소 토큰을 체크하면, 응답이 없는 상태에서 앱이 프리징되는 것을 방지하고 즉각적인 사용자 피드백을 줄 수 있습니다.
LIST