Task.Delay() 和 Thread.Sleep() 区别

一、

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


   }
}

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

 

三、重载

 

 

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值