zoukankan      html  css  js  c++  java
  • C#中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
    {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;
    }


    }
    }

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

  • 相关阅读:
    bzoj2876 [Noi2012]骑行川藏
    关于线性基的一些理解
    bzoj2115 [Wc2011] Xor
    bzoj2884 albus就是要第一个出场
    bzoj2460 [BeiJing2011]元素
    bzoj2005 [Noi2010]能量采集
    关于积性函数的一些理解
    bzoj4300 绝世好题
    Servlet—文件上传
    JNDI—目录接口名
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/15798388.html
Copyright © 2011-2022 走看看