- Thread.Sleep( )

 

코드가 선언된 부분의 해당 쓰레드를 일정시간 멈추는, 시스템(OS) 메서드다

새롭게 쓰레드가 생성되지 않는다.

실행중인 쓰레드를 멈춘다.

 

- Task.Delay( )

 

별도의 비동기(쓰레드)가 생성되어 시간만큼 지연시킨다.

 

// 아래와 같이 사용할 경우, await Task.Delay(1000) 과 논리적으로 같은 역할을 한다.
Thread t1 = new Thread(() => Thread.Sleep(1000));
t1.Start( );

 

예제)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

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

namespace Serialization
{
    class sleepdelay
    {
        static void ThreadSleep()
        {
            Console.WriteLine("1 : " + Thread.CurrentThread.ManagedThreadId + " : " + DateTime.Now.ToString());
            Thread.Sleep(1000);
            
            Console.WriteLine("2 : " + Thread.CurrentThread.ManagedThreadId + " : " + DateTime.Now.ToString());
        }

        static async void TaskSleep()
        {
            Console.WriteLine("3 : " + Thread.CurrentThread.ManagedThreadId + " : " + DateTime.Now.ToString());
            await Task.Delay(1000);
            Console.WriteLine("4 : " + Thread.CurrentThread.ManagedThreadId + " : " + DateTime.Now.ToString());
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Start Test");

            Task.Run(()=>
            {
                // ThreadSleep()은 해당 메인 쓰레드를 일정시간 멈추는, 시스템(OS) 메서드다
                // 새롭게 쓰레드가 생성되지 않는다.
                // Thread.Sleep();

                // Task.Deley()아래와 같을경우 논리적 역할을 한다.
                Thread t1 = new Thread(new ThreadStart(ThreadSleep));

                Console.WriteLine("6 : " + Thread.CurrentThread.ManagedThreadId + " : " + DateTime.Now.ToString());
                t1.Start();
                Console.WriteLine("7 : " + Thread.CurrentThread.ManagedThreadId + " : " + DateTime.Now.ToString());

                Console.WriteLine("8 : " + Thread.CurrentThread.ManagedThreadId + " : " + DateTime.Now.ToString());
                // Task.Delay()의 경우, 시작과 동시에 반환되며, 비동기(쓰레드)가 생성되어 시간만큼 지연후 실행된다.
                TaskSleep();
                Console.WriteLine("9 : " + Thread.CurrentThread.ManagedThreadId + " : " + DateTime.Now.ToString());
            });

            int a = 0;
            while (a != 6)
            {
                Thread.Sleep(1000);
                a++;
            }
        }
    }
}

 

ubiquitous4g