Task.Delay는 해당 스레드에게 흐름을 넘기고 논리적으로 시간을 기다린다. (non-blocking)
간단한 예시
Thread.Sleep
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.Go();
}
void Method()
{
Thread.Sleep(3000);
Console.WriteLine("Method()");
}
void Go()
{
Method();
while (true)
{
Thread.Sleep(300);
Console.Write("1");
}
}
}
| cs |
0.3초마다 "1"을 출력하는 스레드에서 Thread.Sleep을 호출해보았다.
다음과 같이 3초간 기다린후 "Method()" 호출이 된 이후에야 스레드가 진행되는 것을 확인 할 수 있다.
Task.Delay
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.Go();
}
async void MethodAsync()
{
await Task.Delay(3000);
Console.WriteLine("MethodAsync()");
}
void Go()
{
MethodAsync();
while (true)
{
Thread.Sleep(300);
Console.Write("1");
}
}
}
| cs |
반면 Task.Delay를 비동기적으로 실행해 주니 "1"을 출력하는 흐름을 막지 않고 3초가 지난 이후에 "MethodAsync()"가 출력되는 모습이 보인다.

