C# - Task (2)

One·2022년 5월 26일
1

C#

목록 보기
2/3
post-thumbnail

Task 작업 취소

CancellationTockenSource

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를 취소하기 위해서는 아래와 같은 순서로 진행한다.

  • CancellationTokenSource 필드를 선언
  • CancellationTokenSource 객체를 생성
  • 비동기 작업 메서드 안에서 작업이 취소되었는지를 체크하는 코드 작성
  • 취소 버튼이 눌러지면 CancellationTokenSource의 Cancel() 메서드를 호출해 작업 취소를 요청한다.

CancellationToken.Register()

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();

...

CancellationToken.ThrowIfCacellationRequested()

해당 토큰의 취소가 요청된 경우 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); 

...
profile
Unity Developer

0개의 댓글