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
'.NET' 카테고리의 다른 글
| C#에서도 inet_addr과 동일한 역할을 수행하는 함수 (0) | 2026.02.04 |
|---|---|
| XDF0003 Microsoft.Windows.Shell 오류 발생 해결 방법 (1) | 2026.01.23 |
| C# float string format 전체 길이와 소수점 자리수 제어 (2) | 2025.07.28 |
| C#에서 DllImport를 사용해서 C++ DLL 함수를 호출할 때 진입점 못찾는 문제 관련 dumpbin 사용법 (1) | 2025.07.21 |
| C# Throw 발생 방법 (0) | 2025.05.13 |