CancellationTokenSource 클래스는 Cancellation Token을 생성하고 Cancel 요청을 Cancellation Token들에게 보내는 일을 담당하고, CancellationToken은 현재 Cancel 상태를 모니터링하는 여러 Listener들에 의해 사용되는 구조체이다.
private static void CancelableTasks() {
var cts = new CancellationTokenSource();
var token = cts.Token;
Task t = new Task(() => {
int i = 0;
while (true) {
if (token.IsCancellationRequested)
break;
else
Console.WriteLine($"{i++}\t");
}
});
t.Start();
Console.ReadKey();
cts.Cancel();
Console.WriteLine("Task has been canceled.");
}
Task를 취소하기 위해서는 아래와 같은 순서로 진행한다.
CancellationToken이 취소될 때 호출할 대리자를 등록.
...
token.Register(() => Console.WriteLine("Cancelation has been requested."));
Task t = new Task(() => {
int i = 0;
while (true) {
if (token.IsCancellationRequested) {
break;
} else {
Console.Write($"{i++}\t");
Thread.Sleep(100);
}
}
});
t.Start();
...
해당 토큰의 취소가 요청된 경우 OperationCanceledException이 발생한다.
...
Task t2 = Task.Factory.StartNew(() => {
char c = 'a';
while (true) {
token.ThrowIfCancellationRequested();
if (token.IsCancellationRequested) {
throw new OperationCanceledException("No longer interested in printing letters.");
} else {
Console.Write($"{c++}\t");
Thread.Sleep(200);
}
}
}, token);
...