返回

C# Thread.Sleep与Task.Delay的区别

2024-05-10 C# Thread.Sleep Task.Delay 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);
    });
}

执行结果:

C# Thread.Sleep与Task.Delay的区别

C# Thread.Sleep与Task.Delay的区别

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

执行结果:

C# Thread.Sleep与Task.Delay的区别

C# Thread.Sleep与Task.Delay的区别

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),否则是不会暂停的。

顶部