Featured image of post [C#] CancellationTokenSource 클래스 사용법

[C#] CancellationTokenSource 클래스 사용법

이 글에서는 C#에서 제공하는 CancellationTokenSource 클래스의 개념과 사용법을 자세히 소개합니다. 실용적 예제 코드와 함께 비동기 작업 취소 시나리오에서 CancellationToken의 활용 방법을 알기 쉽게 설명합니다.

CancellationTokenSource 이란

작업의 가능한 취소를 처리하기 위해 예제에서는 개체에 전달되는 취소 토큰을 생성하는 개체를 TaskFactory 인스턴스화 CancellationTokenSource 합니다. 개체는 TaskFactory 취소 토큰을 특정 계측에 대한 판독값 수집을 담당하는 각 작업에 전달합니다.


예제 코드

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
TaskFactory factory = new TaskFactory(token);

// when
bool itShouldNotBeTrue = false;

factory.StartNew(async () =>
{
	Console.WriteLine("Task Start");
	await Task.Delay(1000);
	// if (cancelSource.Token.IsCancellationRequested)
	// {
	//     return;
	// }
	await Task.Delay(1000);
	itShouldNotBeTrue = true;
	Console.WriteLine("Task End : " + itShouldNotBeTrue.ToString());
}, source.Token);
Thread.Sleep(100);
source.Cancel();
Console.WriteLine("Task Cancel : " + itShouldNotBeTrue.ToString());
Thread.Sleep(3000);

예제 설명

위의 코드에 대한 결과값은 아래와 같다.

1
2
3
Task Start
Task Cancel : False
Task End : True

해결 방법

source.Token을 사용하면 factory.StartNew로 실행한 스레드를 다 실행하는것을 확인 할 수 있다. 따라서 아래와 같이 Task.Delay()에서 CancellationTokenSource을 인식 할 수 있도록 해야 한다.

1
await Task.Delay(1000, token); 
Licensed under CC BY-SA 4.0