반응형
비동기 프로그래밍을 할 때 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에 아이템 추가하는 방법들 (0) | 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 |