• 1.Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。
  • 2.Thread.Sleep()会阻塞线程,Task.Delay()不会。
  • 3.Thread.Sleep()不能取消,Task.Delay()可以。
  • 4.Task.Delay()实质创建一个运行给定时间的任务,Thread.Sleep()使当前线程休眠给定时间。
  • 5.反编译Task.Delay(),基本上讲它就是个包裹在任务中的定时器。

Task.Delay()和Thread.Sleep()最大的区别是Task.Delay()旨在异步运行,在同步代码中使用Task.Delay()是没有意义的;在异步代码中使用Thread.Sleep()是一个非常糟糕的主意。通常使用await关键字调用Task.Delay()

Thread.Sleep

  • 它会挂起当前执行线程指定时间(调用了系统内核的方法),而这时候当前线程是不能做任何其他的事情,只能等待指定时间后再执行
  • 会让当前执行线程挂起一段时间,而在挂起的过程中,不能去干其他的事情,影响线程池对线程的调度,间接影响系统的并发性

Task.Delay()

  • 它的执行实际上是交给了TimerQueueTimer,也就是定时器队列(每个进程里,所有的timer执行都在一个TimerQueueTimer队列集合里面),在指定时间后回调方法,由ThreadPool中的线程执行。
  • 由创建定时队列消息,在指定时间之后由线程池去处理Callback,而在这指定时间内是由系统去调度的(这里可能我理解不对),而当前执行线程可以继续干其他事情。