Thread.Sleep(1000)和Task.Delay(1000)的区别
转载:Task.Delay() 和 Thread.Sleep() 区别_zxf347085420的博客-CSDN博客
一、
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
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
//点击按钮后,按钮的处理程序
private void btnDoStuff_Click(object sender, RoutedEventArgs e)
{
//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
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void btnDoStuff_Click(object sender, RoutedEventArgs e)
{
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;
}
}
}
异步延迟,不会阻塞线程,窗体不会冻结,可以实时响应!!