C#/Window

비동기 프로그래밍에서 Task.Delay의 독립적인 실행

코샵 2024. 7. 22. 13:32
반응형

비동기 프로그래밍을 할 때 Task.Delay를 사용하면 각 Task가 독립적으로 실행되는 것을 알아두면 좋습니다. 이 포스팅에서는 Task.Delay를 사용할 때의 핵심 원리와 특징을 살펴보겠습니다.

1. 독립적인 실행

아래와 같은 코드에서 statusTask와 backgroundTask는 서로 독립적으로 실행됩니다.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
    private static readonly CancellationTokenSource cts = new CancellationTokenSource();

    private static async Task Main(string[] args)
    {
        var statusTask = MainStatusTask();
        var backgroundTask = BackgroundTask();

        await Task.WhenAll(statusTask, backgroundTask);
    }

    private static async Task MainStatusTask()
    {
        while (true)
        {
            Console.WriteLine("Main status task is running...");
            await Task.Delay(60000, cts.Token);
        }
    }

    private static async Task BackgroundTask()
    {
        var _ThreadSleep = 6000;

        while (true)
        {
            Console.WriteLine("Background task is running...");
            await Task.Delay(_ThreadSleep * 10, cts.Token);
        }
    }
}

statusTask에서는 60초 동안 대기하고, backgroundTask에서는 60초 * 10 = 600초 동안 대기합니다. 하지만 이 두 Task는 서로 영향을 주지 않습니다.

2. 비동기 실행

await Task.Delay를 사용하면 해당 Task의 실행이 일시 중지되지만, 다른 Task의 실행에는 영향을 주지 않습니다. 따라서 두 Task는 병렬로 실행될 수 있습니다.

3. 동시 실행

두 Task가 병렬로 실행되므로, 한 Task가 대기 중일 때 다른 Task는 계속 실행될 수 있습니다. 예를 들어 statusTask에서 60초 대기 중일 때 backgroundTask는 계속해서 자신의 로직을 실행할 수 있습니다.

4. CancellationToken의 역할

cts.Token은 두 Task 모두에서 사용되지만, 이는 취소 신호를 전달하기 위한 것이며 동기화를 위한 것이 아닙니다. 취소 요청이 있을 때만 두 Task가 동시에 영향을 받습니다.

따라서 각 Task의 Task.Delay는 서로 독립적으로 작동하며, 한 Task의 대기가 다른 Task의 실행에 직접적인 영향을 주지 않습니다. 이는 두 Task가 병렬로 실행되면서 각자의 타이밍에 따라 작업을 수행하고 대기하게 됨을 의미합니다.