C\#의 Task.Delay()와 Thread.Sleep()의 차이(코드 사례)
5492 단어 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()에 대한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.