返回顶部
首页 > 资讯 > 精选 >C#中Task.Delay()和Thread.Sleep()的区别是什么
  • 657
分享到

C#中Task.Delay()和Thread.Sleep()的区别是什么

2023-06-15 12:06:18 657人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关C#中Task.Delay()和Thread.Sleep()的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、简介Thread.Sleep()是同步延

这篇文章将为大家详细讲解有关C#中Task.Delay()和Thread.Sleep()的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、简介

Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。
2.Thread.Sleep()会阻塞线程,Task.Delay()不会。
3.Thread.Sleep()不能取消,Task.Delay()可以。
4.Task.Delay()实质创建一个运行给定时间的任务,Thread.Sleep()使当前线程休眠给定时间。
5.反编译Task.Delay(),基本上讲它就是个包裹在任务中的定时器。
6.Task.Delay()和Thread.Sleep()最大的区别是Task.Delay()旨在异步运行,在同步代码中使用Task.Delay()是没有意义的;在异步代码中使用Thread.Sleep()是一个非常糟糕的主意。通常使用await关键字调用Task.Delay()。

二、代码案例

案例一:Thread.Sleep()和Task.Delay()比较

代码:

static void Main(string[] args)        {            //阻塞,出现CPU等待...            Task.Factory.StartNew(delegate            {                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ****** Start Sleep()******");                for (int i = 1; i <=10; i++)                {                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "******Sleep******==>" + i);                    Thread.Sleep(1000);//同步延迟,阻塞一秒                }                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ******End Sleep()******");                Console.WriteLine();            });            //不阻塞            Task.Factory.StartNew(() =>            {                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======StartDelay()======");                for (int i =1; i <=10; i++)                {                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Delay====== ==>" + i);                    Task.Delay(1000);//异步延迟                }                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======End Delay()======");                Console.WriteLine();            });            Console.ReadLine();            Console.ReadKey();        }

结果:

通过运行结果截图对比看出,Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。

C#中Task.Delay()和Thread.Sleep()的区别是什么

案例二:通过async/await实现Task.Delay()同步

代码:

//该段代码通过async/awatit实现“同步”Delay        static void Main(string[] args)        {            Task.Factory.StartNew(async () =>            {                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Start Delay()======");                for (int i = 1; i <=10; i++)                {                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======Delay======" + i);                    await Task.Delay(1000);                }                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " ======End Delay()======");            });            Console.ReadKey();        }

结果:

运行结果可以看出,通过async/await实现了Task.Delay()同步

C#中Task.Delay()和Thread.Sleep()的区别是什么

案例三:Task.Delay()取消

代码:

class Program    {        #region        CancellationTokenSource cts = new CancellationTokenSource();        void PutThreadSleep()        {            Thread.Sleep(5000);        }        async Task PutTaskDelay()        {            try            {                await Task.Delay(5000, cts.Token);//需要.net4.5的支持            }            catch (TaskCanceledException ex)            {                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff ==>") + ex.ToString());            }        }        private void ThreadSleep()        {            PutThreadSleep();            Console.WriteLine("Sleep : I am back");        }        private async void TaskDelay()        {            await PutTaskDelay();            Console.WriteLine("Delay : I am back");        }        private void CancelTaskDelay()        {            cts.Cancel();        }        #endregion                static void Main(string[] args)        {            #region            Program p = new Program();            //不可取消            p.ThreadSleep();            //可取消            p.TaskDelay();            p.CancelTaskDelay();            #endregion            Console.ReadKey();        }    }

结果:

Task.Delay()取消,抛出异常信息。

C#中Task.Delay()和Thread.Sleep()的区别是什么

关于C#中Task.Delay()和Thread.Sleep()的区别是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: C#中Task.Delay()和Thread.Sleep()的区别是什么

本文链接: https://lsjlt.com/news/280099.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#中Task.Delay()和Thread.Sleep()的区别是什么
    这篇文章将为大家详细讲解有关C#中Task.Delay()和Thread.Sleep()的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、简介Thread.Sleep()是同步延...
    99+
    2023-06-15
  • C#中的Task.Delay()和Thread.Sleep()区别(代码案例)
    一、简介 1.Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。 2.Thread.Sleep()会阻塞线程,Task.Delay()不会。 3.Threa...
    99+
    2024-04-02
  • C++和C中const的区别是什么
    本篇内容介绍了“C++和C中const的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!const,这个词字面意思为:常数。这就表示...
    99+
    2023-06-21
  • C# 中StringBuilder和String的区别是什么
    今天就跟大家聊聊有关C# 中StringBuilder和String的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C# StringBuilder和String区别Str...
    99+
    2023-06-17
  • C# 中override和overload的区别是什么
    今天就跟大家聊聊有关C# 中override和overload的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C# override和overload特点重载(Overlo...
    99+
    2023-06-17
  • C#中 new和override的区别是什么
    本篇文章为大家展示了C#中 new和override的区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。override是指“覆盖”,是指子类覆盖了父类的方法。子类的对象无法再访问父类中的该方...
    99+
    2023-06-17
  • c++中ReleaseDC和DeleteDC的区别是什么
    在C++中,ReleaseDC和DeleteDC是两个函数,它们的区别如下:1. ReleaseDC函数:这个函数用于释放设备上下文...
    99+
    2023-09-27
    c++
  • c++中class和struct的区别是什么
    在C++中,class和struct都用于定义自定义的数据类型,但它们之间有几个区别。1. 默认的访问修饰符:在class中,默认的...
    99+
    2023-09-15
    c++
  • c#中EnableViewState和ViewStateMode的区别是什么
    在C#中,EnableViewState和ViewStateMode都是用于控制ViewState的属性。它们的区别如下: En...
    99+
    2023-10-23
    c#
  • c++中break和continue的区别是什么
    在C++中,break和continue是两个控制流语句,用于在循环中控制程序的执行流程。 break语句用于终止当前循环(for...
    99+
    2024-03-01
    c++
  • C#中Write()和WriteLine()的区别是什么
    Write()和WriteLine()都是用于输出文本到控制台的方法,它们的区别在于: Write()方法在输出文本后不会自动换行...
    99+
    2024-03-01
    C#
  • c语言中s和c的区别是什么
    c语言中s和c的区别在于输出数据类型:s用于输出字符串,而c用于输出单个字符。此外,s支持宽度指定和精度指定,而c不支持;s支持空格填充,而c不支持。 C语言中s和c的区别 s和c是C...
    99+
    2024-05-12
    c语言
  • c 和java的区别是什么
    Java和C都是指令式语言(Imperative Language),不同的是Java有面向对象(OO)成分在里面,而C是完全面向过程的,C的高级版本C++、C#支持面向对象。另外一个不同是,Java跨平台,既不同的操作系统都可以通过JVM...
    99+
    2019-02-23
    java教程 c java 区别
  • java和c++的区别是什么
    Java和C++是两种常见的编程语言,在以下几个方面有所不同:1. 语法结构:Java是一种面向对象的编程语言,其语法结构较为简洁和...
    99+
    2023-08-30
    java
  • C++中vector和list区别是什么
    这篇文章主要讲解了“C++中vector和list区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中vector和list区别是什么”吧!一张表格让你理解vector和list...
    99+
    2023-06-26
  • Linux C中sockaddr和sockaddr_in的区别是什么
    这篇文章给大家分享的是有关Linux C中sockaddr和sockaddr_in的区别是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux C中sockaddr和sockaddr_in的区别struc...
    99+
    2023-06-09
  • c#中运算符?和??的区别是什么
    和 运算符都是条件运算符,用于选择值。 运算符如果任一操作数为 null 则引发异常, 运算符用于安全处理空值,如果左操作数为 null,则返回右操作数。 C# 中运算符 和 ...
    99+
    2024-05-10
    c#
  • C++ sleep()和usleep()的区别是什么
    本篇内容介绍了“C++ sleep()和usleep()的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!sleep() ...
    99+
    2023-07-05
  • C语言中const和define的区别是什么
    本文小编为大家详细介绍“C语言中const和define的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中const和define的区别是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。def...
    99+
    2023-06-29
  • c语言中typedef和define的区别是什么
    这篇文章主要介绍“c语言中typedef和define的区别是什么”,在日常操作中,相信很多人在c语言中typedef和define的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”c语言中typed...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作