1、Thread.Sleep 是同步延迟,Task.Delay异步延迟。

2、Thread.Sleep 会阻塞线程,Task.Delay不会。

3、Thread.Sleep不能取消,Task.Delay可以。

4. Task.Delay() 比 Thread.Sleep() 消耗更多的资源,但是Task.Delay()可用于为方法返回Task类型;或者根据CancellationToken取消标记动态取消等待

5. Task.Delay() 实质创建一个运行给定时间的任务, Thread.Sleep() 使当前线程休眠给定时间。

二、区别:

1、同步延迟

using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace MessagePump
{undefined
public partial class MainWindow : Window
{undefined
public MainWindow()
{undefined
InitializeComponent();
}

//点击按钮后,按钮的处理程序
private void btnDoStuff_Click(object sender, RoutedEventArgs e)
{undefined
//1.禁用按钮:这样在处理程序执行期间,用户就不能再次点击了
btnDoStuff.IsEnabled = false;
//2.将标签文本改为Doing Stuff
lblStatus.Content = "Doing Stuff";
//3.将程序休眠4s:模拟某个工作
Thread.Sleep(4000);
//4.将标签文本改为原始文本
lblStatus.Content = "Not Doing Anything";
//5.启用按钮
btnDoStuff.IsEnabled = true;
}

当点击按钮后,什么都没有发生。而且如果在点击按钮后移动窗体,会发现它已经冻结,不会移动---直到4s之后,窗体才突然出现在新位置。

2、异步延迟---使用async/await特性

using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace MessagePump
{undefined
public partial class MainWindow : Window
{undefined
public MainWindow()
{undefined
InitializeComponent();
}

private async void btnDoStuff_Click(object sender, RoutedEventArgs e)
{undefined
btnDoStuff.IsEnabled = false;
lblStatus.Content = "Doing Stuff";

//处理程序的消息队列中:先将上面2行代码压入消息队列,将下面的delay消息先从处理器上摘下来,等4s之后,再将自己压入队列。那么:所有的消息就不用等待了,这就可以保持GUI的实时响应了。

//当到达await 语句时,处理程序返回到调用方法,这时处理器已经压入队列中的上面2条语句得以处理。

//等完成这里的空闲任务(等待4s之后)后,接着继续执行处理程序中的最后2条消息。
await Task.Delay(4000);

//4s之后,文字又变为"Not Doing Anything"
lblStatus.Content = "Not Doing Anything";
btnDoStuff.IsEnabled = true;
}

异步延迟,不会阻塞线程,窗体不会冻结,可以实时响应!!