首页 > 编程语言 >c# Thread.Sleep 与 Task.Delay 在多线程中的影响

c# Thread.Sleep 与 Task.Delay 在多线程中的影响

时间:2023-06-27 17:12:17浏览次数:44  
标签:task1 Task Thread Delay tasks Sleep 多线程

一般在函数执行的时候,如果需要让一个任务等待一会儿在执行,大部分都是采用的Thread.Sleep()语句。

但如果该函数要复用,同时要给函数一个参数,并让该函数被线程调用后并发执行。

当采用如下调用方式的时候,就会出现什么情况呢?就会出现线程阻塞,你会发现只有task1 执行,也即只有一个线程在运行。

 1 private  Task task1(int i)
 2         {
 3             while (true)
 4             {
 5                 Thread.Sleep(5000);
 6                 Console.WriteLine(string.Format("task{0} 执行:{1}",i,DateTime.Now));
 7             }
 8         }
 9 
10 private void run()
11         {
12             List<Task> tasks = new List<Task>();
13             Task task3 = task1(1);
14             Task task4 = task1(2);
15             tasks.Add(task3);
16             tasks.Add(task4);
17             Task.WaitAll(tasks.ToArray());
18         }

 这么说明,在这里的Thread.Sleep函数造成了阻塞,使得只有一个线程在运行。那如何避免这种情况发生呢。

此时就需要采用Task.Delay(1000),它能够有效避免上述情况发生。将上述Thread.Sleep(5000)改为Task.Delay(5000),别忘了加await ,修改后代码如下:

 1     private async Task task1(int i)
 2         {
 3             while (true)
 4             {
 5                 await Task.Delay(5000);
 6                 Console.WriteLine(string.Format("task{0} 执行:{1}",i,DateTime.Now));
 7             }
 8         }
 9 
10  private void run()
11         {
12             List<Task> tasks = new List<Task>();
13             Task task3 = task1(1);
14             Task task4 = task1(2);
15             tasks.Add(task3);
16             tasks.Add(task4);
17             Task.WaitAll(tasks.ToArray());
18         }

 改为上面形式就可以并发执行了。

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() 使当前线程休眠给定时间。


参考链接: https://blog.csdn.net/zxf347085420/article/details/93347885

 

标签:task1,Task,Thread,Delay,tasks,Sleep,多线程
From: https://www.cnblogs.com/angelbang/p/17509387.html

相关文章

  • 【多线程笔记】如何优雅关闭线程
    在C#中,可以使用CancellationToken来优雅地关闭线程。CancellationToken是一个结构体,用于向线程发送信号以请求线程停止运行。以下是一个使用CancellationToken的示例代码:usingSystem;usingSystem.Threading;publicclassWorker{privateCancellationTokenSource_canc......
  • RT-Thread 正点原子阿波罗STM32F429IGT6-软件IIC控制I/O扩展模块PCF8574T(踩坑)
    第一步:在RT-ThreadSettings中打开I2C设备驱动,Ctrl+S保存 第二步:在drivers->board.h中进行配置,取消BSP_USING_I2C2的注释,并根据说明定义好引脚; 第三步:对引脚进行初始化,这里可使用CubeMX进行生成; 第四步:根据设备名查找设备 第五步:调用 rt_i2c_transfer 发......
  • tqt507 pthread 多线程测试 atomic 原子操作
    ////tqt057测试结果find/opt-name*atomic.h*//aarch64-linux-gnu-gccdemoatomic.c-odemoatomic-pthread-I/opt/EmbedSky/TQT507/CoreA/longan/kernel/linux-4.9/tools/include//cp./demoatomic/home/book/nfs_rootfs#include<linux/atomic.h>#inclu......
  • 多进程和多线程以及协程的创建模板
    【一】开启多进程的创建模板(基于Process模块)【1】方式一:创建多进程importmultiprocessingdefworker(n):"""子进程要执行的任务"""print(f'子进程{n}正在执行')defmain():task_lists=[]foriinrange(100)#创建一个进程对象......
  • Freertos学习05-Task状态打印
    一、前言TaskList()是FreeRTOS中的一个函数,它可以列出所有当前正在运行的任务。这个函数可以用于调试和监视系统中的任务。它返回一个指向任务列表的指针,其中包含每个任务的名称、状态、优先级和堆栈使用情况等信息。二、函数介绍该函数的输入参数为数据缓存区的地址,可......
  • Freertos学习03-Task状态
    一、前言FreeRTOS是一个流行的实时操作系统,它支持多任务处理。在FreeRTOS中,任务有不同的状态,这些状态反映了任务在系统中的行为。二、状态特点任务可以存在于以下状态中:运行当任务实际执行时,它被称为处于运行状态。任务当前正在使用处理器。如果运行RTOS的处理器只......
  • 线程上运行 task
    我没能实现始终在一个线程上运行task 前文我们总结了在使用常驻任务实现常驻线程时,应该注意的事项。但是我们最终没有提到如何在处理对于带有异步代码的办法。本篇将接受笔者对于该内容的总结。如何识别当前代码跑在什么线程上一切开始之前,我们先来使用一种简单的方式来识......
  • Freertos学习03-Task优先级
    一、前言FreeRTOS是一个流行的实时操作系统,它允许用户创建多个任务并在它们之间共享处理器时间。在FreeRTOS中,任务的优先级别是非常重要的,因为它决定了任务在系统中的执行顺序。二、任务优先级特点FreeRTOS中的任务优先级别是一个整数,范围从0到configMAX_PRIORITIES-1,其......
  • Freertos学习02-Task传入参数
    一、前言介绍了freertos具有许多特点,其中的任务调度将有助提高系统的实时性,并将各任务解耦,有助于产品的后续维护与开发,上一节介绍了freertos中关于任务的创建与删除,这一节介绍如何在创建函数的同时并传递参数。二、传递参数再次回顾xTaskCreate()函数的用法以及各输入参数,其中......
  • Redfish是一种现代、开放且标准化的远程管理和监控接口,由DMTF(Distributed Management
    Redfish是一种现代、开放且标准化的远程管理和监控接口,由DMTF(DistributedManagementTaskForce)开发和维护。它基于RESTfulAPI设计,使用JSON或OData格式进行数据交换。Redfish旨在提供简化、灵活和可互操作的远程管理解决方案,取代或与传统的远程管理技术(如IPMI)配合使用。Redfish......