C\#의 Task.Delay()와 Thread.Sleep()의 차이(코드 사례)

프로필
1.Thread.Sleep()은 동기 지연 이 고 Task.Delay()는 비동기 지연 입 니 다.
2.Thread.Sleep()은 스 레 드 를 막 습 니 다.Task.Delay()는 그렇지 않 습 니 다.
3.Thread.Sleep()은 취소 할 수 없습니다.Task.Delay()는 가능 합 니 다.
4.Task.Delay()는 주어진 시간 을 실행 하 는 작업 을 실질 적 으로 만 듭 니 다.Thread.Sleep()은 현재 스 레 드 를 휴면 시 킵 니 다.
5.Task.Delay()를 역 컴 파일 합 니 다.기본적으로 작업 에 포 함 된 타이머 입 니 다.
6.Task.Delay()와 Thread.Sleep()의 가장 큰 차 이 는 Task.Delay()가 비동기 적 으로 실행 되 는 것 을 목적 으로 하고 동기 코드 에서 Task.Delay()를 사용 하 는 것 은 무의미 하 다 는 것 이다.비동기 코드 에서 Thread.sleep()를 사용 하 는 것 은 매우 나 쁜 생각 이다.보통 await 키 워드 를 사용 하여 Task.Delay()를 호출 합 니 다.
코드 사례
사례 1:Thread.Sleep()과 Task.Delay()비교
코드:

static void Main(string[] args)
        {
            //  ,  CPU  ...
            Task.Factory.StartNew(delegate
            {
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ****** Start Sleep()******");
                for (int i = 1; i <=10; i++)
                {
                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "******Sleep******==>" + i);
                    Thread.Sleep(1000);//    ,    
                }
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ******End Sleep()******");
                Console.WriteLine();
            });

            //   
            Task.Factory.StartNew(() =>
            {
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======StartDelay()======");
                for (int i =1; i <=10; i++)
                {
                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Delay====== ==>" + i);
                    Task.Delay(1000);//    
                }
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======End Delay()======");
                Console.WriteLine();
            });
            Console.ReadLine();

            Console.ReadKey();
        }
결과:
실행 결과 캡 처 비 교 를 통 해 알 수 있 듯 이 Thread.Sleep()은 동기 지연 이 고 Task.Delay()는 비동기 지연 입 니 다.

사례 2:async/await 를 통 해 Task.Delay()동기 화
코드:

//      async/awatit  “  ”Delay
        static void Main(string[] args)
        {
            Task.Factory.StartNew(async () =>
            {
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Start Delay()======");
                for (int i = 1; i <=10; i++)
                {
                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Delay======" + i);
                    await Task.Delay(1000);
                }
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======End Delay()======");
            });
            Console.ReadKey();
        }
결과:
실행 결 과 를 통 해 알 수 있 듯 이 async/await 를 통 해 Task.Delay()동기 화 를 실현 하 였 습 니 다.

사례 3:Task.Delay()취소
코드:

class Program
    {
        #region
        CancellationTokenSource cts = new CancellationTokenSource();
        void PutThreadSleep()
        {
            Thread.Sleep(5000);
        }

        async Task PutTaskDelay()
        {
            try
            {
                await Task.Delay(5000, cts.Token);//  .net4.5   
            }
            catch (TaskCanceledException ex)
            {
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff ==>") + ex.ToString());
            }
        }

        private void ThreadSleep()
        {
            PutThreadSleep();
            Console.WriteLine("Sleep : I am back");
        }

        private async void TaskDelay()
        {
            await PutTaskDelay();
            Console.WriteLine("Delay : I am back");
        }

        private void CancelTaskDelay()
        {
            cts.Cancel();
        }

        #endregion
        
        static void Main(string[] args)
        {
            #region
            Program p = new Program();
            //    
            p.ThreadSleep();
            //   
            p.TaskDelay();
            p.CancelTaskDelay();

            #endregion
            Console.ReadKey();
        }
    }
결과:
Task.Delay()를 취소 하고 이상 한 정 보 를 던 집 니 다.

3.총화
Task.Delay(),async/await 와 CancellationTokenSource 를 조합 하여 사용 하면 제어 가능 한 비동기 지연 을 실현 할 수 있 습 니 다.
이상 은 C\#의 Task.Delay()와 Thread.Sleep()의 차이(코드 사례)에 대한 상세 한 내용 입 니 다.C\#Task.Delay()와 Thread.Sleep()에 대한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기