프로그래밍/C#

[C#] Parallel.For() 과 CancellationToken

Victory_HA 2023. 5. 25. 13:21
  • 아래는 Parallel.For()를 사용할 때 ParallelOptions와 CancellationToken을 함께 사용하는 예시 코드입니다.
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // CancellationTokenSource를 생성하여 CancellationToken을 만듭니다.
        var cancellationTokenSource = new CancellationTokenSource();
        var cancellationToken = cancellationTokenSource.Token;

        // ParallelOptions를 생성하고 CancellationToken을 설정합니다.
        var parallelOptions = new ParallelOptions
        {
            CancellationToken = cancellationToken
        };

        Console.WriteLine("Press any key to cancel...");
        Console.ReadKey();

        // 작업을 취소하기 위해 CancellationTokenSource에 취소 요청을 보냅니다.
        cancellationTokenSource.Cancel();

        try
        {
            Parallel.For(0, 10, parallelOptions, i =>
            {
                // 작업이 진행되는 동안 작업 취소 요청을 확인합니다.
                parallelOptions.CancellationToken.ThrowIfCancellationRequested();

                // 작업 내용
                Console.WriteLine($"Iteration {i} started");
                Thread.Sleep(1000);
                Console.WriteLine($"Iteration {i} completed");
            });
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("Operation was cancelled.");
        }

        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }
}
  • 이 코드는 Parallel.For()를 사용하여 0부터 9까지의 반복 작업을 수행합니다.
  • ParallelOptions를 생성하고 CancellationToken을 설정하여 작업 취소를 관리합니다.
  • Console.ReadKey()를 통해 언제든지 작업을 취소할 수 있습니다.
  • cancellationTokenSource.Cancel()을 호출하여 작업을 취소합니다.
  • Parallel.For() 블록 내에서 parallelOptions.CancellationToken.ThrowIfCancellationRequested()를 사용하여 작업이 진행되는 동안 작업 취소 요청을 확인하고 예외를 throw할 수 있습니다.
  • 작업이 취소되면 OperationCanceledException이 throw되고 해당 예외를 catch하여 작업이 취소되었음을 알 수 있습니다.

'프로그래밍 > C#' 카테고리의 다른 글

[C#] IEnumerable  (0) 2023.08.24
[C#] 우아하게 코딩하기  (0) 2023.05.27
[C#] CancellationToken 사용하기  (0) 2023.05.25
[C#] 객체 동일 여부 판단하기 - ReferenceEquals()  (0) 2023.05.10
[C#] Transaction  (0) 2023.03.29