2017년 2월 20일 월요일

Thread.Sleep vs Task.Delay

Thread.Sleep은 해당 스레드를 차단하고 시간을 기다린다. (blocking)
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()"가 출력되는 모습이 보인다.



















댓글 없음:

댓글 쓰기