본문 바로가기

C#

Task cancellation

728x90

Task, Task<TResult> 클래스는 cancellation tokens을 사용하여 취소를 지원합니다. 작업 클래스에서 취소하려면 취소할 수 있는 작업을 나타내는 사용자 대리자와 취소를 요청한 코드 간의 협조가 필요합니다. 성공적으로 취소하려면 CancellationTokenSource.Cancel 메서드를 호출하는 요청 코드와 적절한 시간에 작업을 종료하는 사용자 대리자가 필요합니다. 다음 방법 중 하나를 사용하여 작업을 종료할 수 있습니다.

  • 대리자에서 반환합니다. 많은 시나리오에서 이 옵션은 충분합니다. 그러나 이러한 방식으로 취소된 작업 인스턴스는 TaskStatus.Canceled 상태가 아닌 TaskStatus.RanToCompletion 상태로 전환됩니다.
  • OperationCanceledException을 발생시키고 취소가 요청된 토큰을 전달합니다. 선호하는 수행 방법은 ThrowIfCancellationRequestd 메서드를 사용하는 것입니다. 이러한 방식으로 취소된 작업은 취소됨 상태로 전환되며 호출 코드는 작업이 취소 요청에 응답했는지 확인하는데 사용할 수 있습니다.
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var tokenSource2 = new CancellationTokenSource();
        CancellationToken ct = tokenSource2.Token;

        var task = Task.Run(() =>
        {
            // Were we already canceled?
            ct.ThrowIfCancellationRequested();

            bool moreToDo = true;
            while (moreToDo)
            {
                // Poll on this property if you have to do
                // other cleanup before throwing.
                if (ct.IsCancellationRequested)
                {
                    // Clean up here, then...
                    ct.ThrowIfCancellationRequested();
                }
            }
        }, tokenSource2.Token); // Pass same token to Task.Run.

        tokenSource2.Cancel();

        // Just continue on this thread, or await with try-catch:
        try
        {
            await task;
        }
        catch (OperationCanceledException e)
        {
            Console.WriteLine($"{nameof(OperationCanceledException)} thrown with message: {e.Message}");
        }
        finally
        {
            tokenSource2.Dispose();
        }

        Console.ReadKey();
    }
}

 

[출처]
https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/task-cancellation

728x90