웨이드 진공 믹서기 블렌더, 웨이드 진공블렌더
코샵
끄적끄적 코딩 공방
코샵

인기 글

  • 분류 전체보기 (485) N
    • 상품 추천 (6) N
    • MongoDB (4)
    • 일기장 (4)
    • Unity (138)
      • Tip (41)
      • Project (1)
      • Design Pattern (8)
      • Firebase (6)
      • Asset (2)
    • 파이썬 (127)
      • Basic (40)
      • OpenCV (8)
      • Pandas (15)
      • PyQT (3)
      • SBC(Single Board Computer) (1)
      • 크롤링 (14)
      • Fast API (29)
      • Package (6)
    • Linux (4)
    • C# (97)
      • Algorithm (11)
      • Window (7)
    • TypeScript (48) N
      • CSS (10) N
    • Git (11)
    • SQL (5)
    • Flutter (10)
      • Tip (1)
    • System (1)
    • BaekJoon (6)
    • Portfolio (2)
    • MacOS (1)
    • 유틸리티 (1)
    • 서비스 (6)
    • 자동화 (3)
    • Hobby (10)
      • 물생활 (10)
      • 식집사 (0)
전체 방문자
오늘
어제

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.
코샵

끄적끄적 코딩 공방

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가 병렬로 실행되면서 각자의 타이밍에 따라 작업을 수행하고 대기하게 됨을 의미합니다.

저작자표시 비영리 변경금지 (새창열림)

'C# > Window' 카테고리의 다른 글

Windows Forms의 ComboBox에 아이템 추가하는 방법들  (2) 2024.07.29
.NET 프로젝트의 출력 폴더 이름 변경하기  (0) 2024.07.28
Windows Forms PictureBox  (3) 2024.07.24
RichTextBox에 텍스트 추가하고 자동 스크롤하기  (0) 2024.07.23
SendMessage와 PostMessage  (0) 2024.05.26
    'C#/Window' 카테고리의 다른 글
    • .NET 프로젝트의 출력 폴더 이름 변경하기
    • Windows Forms PictureBox
    • RichTextBox에 텍스트 추가하고 자동 스크롤하기
    • SendMessage와 PostMessage
    코샵
    코샵
    나의 코딩 일기장

    티스토리툴바