728x90
비동기 프로그래밍은 C#에서 매우 강력한 기능으로, 애플리케이션이 메인 스레드를 차단하지 않고 작업을 수행할 수 있게 하여 응답성과 효율성을 향상시킵니다. 이 글에서는 비동기 프로그래밍의 중요한 측면 중 하나인 취소 토큰에 대해 알아보고, 이를 활용하여 응용 프로그램의 성능과 사용자 경험을 개선하는 방법을 설명합니다.
취소 토큰이란 무엇인가?
취소 토큰은 작업이 취소되어야 함을 신호하는 데 사용됩니다. 이는 프로그램의 한 부분(예: 사용자 인터페이스 또는 다른 작업)이 다른 부분(예: 진행 중인 백그라운드 작업)에 실행을 중지해야 한다고 알리는 방법을 제공합니다.
취소 토큰의 작동 원리
- 취소 토큰 소스 생성:
CancellationTokenSource의 인스턴스를 생성합니다.- 이 인스턴스로부터 관련된
CancellationToken을 얻습니다.
- 토큰 전달:
- 비동기 작업(예: 작업)을 시작할 때 토큰을 매개변수로 전달합니다.
- 취소 요청 확인:
- 장시간 실행되는 메서드나 작업 내에서 주기적으로
token.IsCancellationRequested를 호출하여 취소가 요청되었는지 확인합니다. true를 반환하면 메서드에서 우아하게 종료합니다.
- 장시간 실행되는 메서드나 작업 내에서 주기적으로
- 취소 요청:
- 실행 중인 작업 외부에서 취소를 요청하려면
CancellationTokenSource의Cancel()을 호출합니다.
- 실행 중인 작업 외부에서 취소를 요청하려면
728x90
왜 취소 토큰을 사용해야 하는가?
- 사용자 경험: 파일 다운로드나 데이터 처리와 같은 장시간 실행되는 작업이 발생할 수 있는 애플리케이션에서는 사용자가 이러한 작업을 취소할 수 있는 옵션을 기대합니다.
- 자원 관리: 불필요한 작업을 취소하면 메모리와 CPU 사이클과 같은 자원을 해제하는 데 도움이 됩니다.
- 제어 흐름: 작업 실행 흐름에 대한 더 나은 제어를 제공하여 특정 조건에서 프로세스를 조기에 중지해야 하는 시나리오를 처리할 수 있습니다.
실용적인 예제
다음은 비동기 파일 다운로드 시나리오에서 취소 토큰을 사용하는 방법을 보여주는 예제입니다:
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// 새로운 CancellationTokenSource 생성
using var cts = new CancellationTokenSource();
// 비동기적으로 다운로드 시작
var downloadTask = DownloadFileAsync("https://example.com/largefile.zip", cts.Token);
Console.WriteLine("다운로드를 취소하려면 'c'를 누르세요...");
// 취소하기 전에 사용자 입력 대기
if (Console.ReadKey(true).KeyChar == 'c')
{
cts.Cancel(); // 취소 요청
Console.WriteLine("다운로드가 취소되었습니다.");
}
try
{
await downloadTask; // 다운로드 작업 완료 대기
Console.WriteLine("다운로드가 성공적으로 완료되었습니다.");
}
catch (OperationCanceledException)
{
Console.WriteLine("다운로드가 취소되었습니다.");
}
}
static async Task DownloadFileAsync(string url, CancellationToken token)
{
using HttpClient client = new HttpClient();
var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
using var stream = await response.Content.ReadAsStreamAsync();
byte[] buffer = new byte[81920]; // 바이트를 읽기 위한 버퍼 크기.
int bytesRead;
while ((bytesRead = await stream.ReadAsync(buffer.AsMemory(), token)) > 0)
{
if(token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested(); // 취소되었을 경우 예외 발생.
}
// 바이트를 어딘가에 쓰는 것을 시뮬레이션...
Console.Write(".");
await Task.Delay(100); // 처리 중 지연을 시뮬레이션.
}
}
}
예제 설명
- 프로그램 시작 시
CancellationTokenSource가 생성됩니다. DownloadFileAsync를 통해 비동기 파일 다운로드를 시작하며, 취소 토큰을 함께 전달합니다.- 프로그램은 사용자 입력을 대기하며, 'c'를 누르면
cts.Cancel()을 호출하여 취소 요청을 트리거합니다. - 다운로드 메서드(
DownloadFileAsync) 내에서 스트림의 데이터를 계속 읽으며, 모든 데이터가 읽히거나 취소가 요청될 때까지 진행합니다. 취소가 요청되면 예외를 발생시켜 적절한 정리를 할 수 있게 합니다.
이 접근 방식은 사용자가 긴 프로세스를 제어할 수 있는 응답성 있는 애플리케이션을 가능하게 하며, 차단 호출로 인해 발생할 수 있는 비응답성 행동으로 인한 프리징이나 충돌을 방지합니다.
C#의 비동기 코드 구조 내에서 취소 토큰을 효과적으로 이해하고 구현함으로써 기능성과 사용자 경험을 크게 향상시킬 수 있습니다!
728x90
'프로그래밍 > C#' 카테고리의 다른 글
| C# 리플렉션: 동적 프로그래밍의 강력한 도구 (1) | 2025.09.05 |
|---|---|
| C# 리플렉션: 동적 프로그래밍의 강력한 도구 (0) | 2025.09.05 |
| 비동기 프로그래밍과 C#의 Task Parallel Library (TPL) 활용법 (0) | 2025.09.04 |
| C#에서 비동기 프로그래밍의 힘: 효율적인 애플리케이션 개발 (0) | 2025.09.03 |
| LINQ to XML: C#에서 XML 데이터를 효율적으로 처리하는 방법 (0) | 2025.09.03 |