- 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++;
}
}
}
}