首页 > 其他分享 >Task.Delay 和 Thread.Sleep 的区别

Task.Delay 和 Thread.Sleep 的区别

时间:2024-11-07 15:47:23浏览次数:5  
标签:异步 Task Thread Delay 线程 Sleep

Task.Delay 和 Thread.Sleep 都可以用来在代码中引入延迟,但它们之间有几个关键的区别:

  1. 异步 vs. 同步:

    • Thread.Sleep 是一个同步方法,它会阻塞当前线程,直到指定的时间过去。这意味着在 Thread.Sleep 执行期间,当前线程不能做任何其他事情,这可能会导致应用程序的响应性降低,尤其是在UI线程中使用时。
    • Task.Delay 是一个异步方法,它不会阻塞当前线程。相反,它会返回一个 Task 对象,该对象在指定的时间后完成。这允许程序继续执行其他任务,直到 Task 完成。
  2. 取消支持:

    • Task.Delay 支持取消操作,允许你提前结束延迟。这通过传递一个 CancellationToken 来实现,可以在需要时取消延迟。
    • Thread.Sleep 不支持取消。一旦开始,它将一直持续到指定的时间过去。
  3. 上下文:

    • Thread.Sleep 通常用于同步代码中,因为它会阻塞当前线程。
    • Task.Delay 用于异步代码中,它允许异步方法在等待时释放线程,以便执行其他任务。
  4. 异常处理:

    • Task.Delay 可以抛出异常,例如当传递给它的 CancellationToken 被取消时,它会抛出 TaskCanceledException
    • Thread.Sleep 不会抛出异常,除非发生非预期的错误。
  5. 性能:

    • 使用 Thread.Sleep 可能会导致线程池中的线程被不必要地占用,尤其是在高并发场景下,这可能会影响应用程序的性能。
    • Task.Delay 更高效,因为它不会占用线程,直到 Task 完成。
  6. 适用场景:

    • 如果你正在编写同步代码,或者需要一个简单的延迟而不需要取消支持,Thread.Sleep 可能是一个合适的选择。
    • 如果你正在编写异步代码,或者需要一个可以取消的延迟,Task.Delay 是更好的选择。

总结来说,Task.Delay 是异步编程中的首选方法,因为它不会阻塞线程,支持取消,并且更加适合现代应用程序的需求。而 Thread.Sleep 则更适合于简单的同步代码中的延迟需求。

标签:异步,Task,Thread,Delay,线程,Sleep
From: https://blog.csdn.net/li0531/article/details/143597437

相关文章

  • C++多线程:package_task
    std::packaged_taskstd::packaged_task包装一个可调用对象,并允许获取该可调用对象计算的结果,可调用对象内部包含两个基本元素:1.被包装的任务任务是一个可调用对象,如函数指针或函数对象,该对象的执行结果会传递给共享状态2.共享状态用于保存任务的返回结果,并可通过future对象异......
  • Java多线程--Thread类的那些事3.--线程的6中状态和sleep()和 join()
      一.sleep()方法  首先在Thead类中有一个静态的sleep()方法,可以让线程进入到休眠状态即TEMD-WAITING状  在调用sleep()方法时需要注意的是在哪个线程里面调用sleep()方法,哪个线程就会进入阻塞状态.,在这个线程中的其他线程不会发生阻塞,只有当休眠时间到来这个......
  • UcOs-III 源码阅读: os_task.c
    //作用:包含任务管理的代码,使用OSTaskCreate(),OSTaskDel(),OSTaskChangePrio()等函数实现;/***********************************************************************************************************uC/OS-III*......
  • 实现.NET 4.0下的Task类相似功能组件
    实现.NET4.0下的Task类相似功能:TaskExCum组件详解引言随着.NET技术的发展,异步编程模型逐渐成为现代应用程序开发中的标准实践之一。.NET4.5引入了Task类,极大地简化了异步编程的过程。然而,许多遗留系统仍在使用.NET4.0或更低版本,这些版本并未直接支持Task类的全......
  • 【笔记】【Android】Activity的Task模式
    【笔记】【Android】Activity的Task模式笔记系列,内容是从网络搜索的结果,不一定是正确的理解。如果存在谬误,欢迎大家指正。Task一个应用可能会包含多个Activity,管理这些Activity顺序的容器,就是Task。当Activity1拉起Activity2时,Task会将Activity2压栈,将显示Activity2的内容。......
  • 在TMOS系统的不同taskID间交互数据
    目录TMOS系统中,每个taskID下都预留了一个事件编号0x8000,用于在不同的taskID中传递数据。由于0x8000占据了一个事件编号,故每个taskID下,用户只能最多自定义15个事件。不同的taskID可以用于将不同的功能划分到不同的作用域中,将代码模块化,方便管理和移植。比如说某个工程中,BLE相关的......
  • 如何实现Dolphinscheduler YARN Task状态跟踪?
    背景Dolphinscheduler针对YARN任务,比如说MR、Spark、Flink,甚至是Shell任务,最初都是会判断如果有YARN任务,解析到applicationId。这样就会不单单以判断客户端进程为单一判断依据,还要根据YARN状态进行最终的Dolphinscheduler任务状态判断。后期,社区对此进行了重构(确实是好的向往,现......
  • 鸿蒙编程江湖:深入理解TaskPool和Worker的并发任务执行
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。鸿蒙系统提供了两种并发能力:TaskPool和......
  • Camunda中的Execution listeners和Task listeners
    在Camunda中大多数节点元素都可以设置执行监听器(Executionlisteners),例如事件、顺序流、用户任务、服务任务和网关。其中用户任务除了可以设置执行监听器,还可以设置独有的用户任务监听器,相比于执行监听器,用户任务监听器可以设置更加细粒度的事件类型。下面针对执行监听器和用户任......
  • InternVL-1.0: Scaling up Vision Foundation Models and Aligningfor Generic Visual
    论文:https://arxiv.org/abs/2312.14238代码:https://github.com/OpenGVLab/InternVL背景在LLM时代,视觉基础模型通常通过一些轻量级的“粘合”层(如QFormer或线性投影)与LLMs连接。然而,这些模型主要源自ImageNet或JFT等纯视觉数据集,或使用图像文本对与BERT系列对齐,缺乏与L......