C# Thread.Sleep与Task.Delay的区别
2024-05-10 1544 0
Thread.Sleep和Task.Delay都是.NET中用于暂停线程执行的方法。那两者有什么区别呢?
下面通过两个简单的例子来说明两者的区别:同时启动100个线程,分别
使用Thread.Sleep和Task.Delay分别让线程暂停10分钟,看看执行结果。
Thread.Sleep
代码:
for (int i = 0; i < 100; i++)
{
Task.Run(() =>
{
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is running");
Thread.Sleep(1000 * 60 * 10);
});
}
执行结果:


Task.Delay
代码:
for (int i = 0; i < 100; i++)
{
Task.Run(async () =>
{
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is running");
await Task.Delay(1000 * 60 * 10);
});
}
执行结果:


Thread.Sleep,每个线程的id都不同,且程序的线程数也达到了100多个。
Task.Delay,线程id存在重复的情况,程序的线程数远远小于100,只有不到30个。
从执行结果可以看出,Task.Delay的线程是重复利用的,而Thread.Sleep的线程是新建的。
因为Thread.Sleep是同步方法,它会阻塞当前线程(线程一直被占用),直到时间到了才会继续执行。
而Task.Delay是异步方法,当执行到await时会暂停,当前线程会被释放回线程池,任务调度器会分配给其它需要执行的任务。当时间到了后,任务调度器也会分配线程继续执行后面的代码(即:await前后执行的线程可能不同)。
在使用Task.Delay暂停执行时,同步环境中使用Task.Delay(1000).Wait(),异步环境中使用await Task.Delay(1000),否则是不会暂停的。