首页 > 编程语言 >C# 线程相关一点杂记

C# 线程相关一点杂记

时间:2024-03-26 15:59:18浏览次数:27  
标签:多线程 Console C# 耗时 任务 杂记 线程 执行

  相信很多人在实际开发中是不愿使用到多线程的,因为一旦引入多线程这个概念,对应功能就需要加很多关于线程的考虑措施,如锁,任务回调顺序等等。有事加了一些对应的措施,还是感觉程序出现偶发的不同问题,这里主要记录一下多线程任务时需要注意的一些毫秒相关的事情。

 for (int i = 0; i < 8; i++)
            {
                Thread.Sleep(1000);
                Console.WriteLine($"{DateTime.Now.ToString("mm:ss.fff")},i={i}");
            }

这段代码模拟一个循环执行8次的任务,实际可能可能有一些功能会和这个比较类似,如设备模块初始化,一些耗时计算等等。

Console.WriteLine作为记录一个任务执行结束的时间记录

 单线程时i的输出顺序还是正常的,同时这种多批次任务时会发现耗时还是比较久的,所以会考虑到异步如await anysc,task,thread等待,这里以task为例

for (int i = 0; i < 8; i++)
{
    Task.Run(() =>
    {
      Thread.Sleep(1000);
       Console.WriteLine($"{DateTime.Now.ToString("mm:ss.fff")},i={i}");
     });
              
}

如果i作为传递的运算参数,就会发现调试运算时i产生莫名奇妙的问题,如顺序错乱,i值异常等等,如

 

   通过输出i会发现i清一色的为8,我这里还只是比较简单的输出i,如果此时i作为比较重要的运算参数就会使程序产生莫名其妙的逻辑问题,这里主要是因为线程它的执行逻辑不是立即触发。

        在底层逻辑中他也是以任务的方式存放在线程池中,在处理器有空余的核心时才会分配任务执行的资源。甚至说for循环次数都执行完毕分出去的8个任务还没有一个开始执行,此时多线程同时访问变量 i,可能会导致闭包问题,因为每个线程都在访问相同的 i 变量。当线程在访问 i 变量时,可能会发生 i 的值在迭代过程中已经发生了变化,这可能会导致输出的 i 值不是期望值

改进措施

for (int i = 0; i < 8; i++)
{
   int value = i;
   Task.Run(() =>
   {      
      Thread.Sleep(1000);
      Console.WriteLine($"{DateTime.Now.ToString("mm:ss.fff")},i={value}");
   });
}

   此时通过在循环内部创建一个局部变量 value,并将 i 的值赋给它,可以确保每个线程都使用正确且的 i 值。但是这样同时就会伴随一个task任务时间执行顺序错乱的问题如

 

        这里我使用datetime输出时间精细度只能到微秒,但是还是能感知到cpu分配核心处理资源的时间不是一样的,想看更细的时间颗粒度,可以转换成ticks去输出感知。

        此时如果我们因为耗时任务想要减少耗时,从而同时派出8个任务,还需要他们按照顺序回来但是因为任务执行时间的不统一,所以在任务执行完毕的关键点需要以排队的形式接收分配出去任务的返回结果,从而减少多任务带来的耗时与多线程带来的数据错乱。

 

最后,既然上面都观察到时间精细到微秒的误差了,可以跳转到第一个单一线程执行任务图

   第一次任务执行时间精确到毫秒是656,但最后一次执行结果时间为729,设计层面中执行8次任务设计的任务耗时都是1000ms,在最后一次执行毫秒刻度也应该与第一次保持一致都为656,但是由于cpu核心分配资源调度问题从而产生了一些时间刻度的误差。

        这种时间误差可能在绝大部分时间都不需要考虑,但是牵扯到一些精细化的数据,此时的误差就是比较重要的问题了。任务的性能,耗时都需要一个比较好的解决方案了。

标签:多线程,Console,C#,耗时,任务,杂记,线程,执行
From: https://www.cnblogs.com/Zjl-NanKe/p/18096823

相关文章

  • YOLOv5改进系列:主干ConvNeXTV2结构助力涨点
    一、论文理论论文地址:ConvNeXtV2:Co-designingandScalingConvNetswithMaskedAutoencoders1.理论思想ConvNeXtV2 在 ConvNeXt 的基础上增加了两个创新点(一个 framework 和一个 technique):全卷积掩码自编码器(fullyconvolutionalmaskedautoencoder,FCMAE)和......
  • 若依(ruoyi-cloud)脚手架解读
    若依(ruoyi-cloud)脚手架解读一、教学目标1.1前置知识点JavaWEB知识体系Spring、SpringMVC、SpringBoot传统MVC框架体系MyBatis持久层框架体系SpringCloudAlibaba微服务落地方案Maven、Git、Idea常规开发工具MySQL、Redis常见关系/非关系型数据库1.2教学目......
  • 超抗干扰/高抗噪LCD液晶段码屏显示驱动芯片VK2C22A/B LQFP52/48适用于单相电表,水表,瓦
    VK2C22A/B概述:      VK2C22A/B是一个点阵式存储映射的LCD驱动器,可支持最大176点(44SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,也可通过指令进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。特点:•  工作电压2.4-5.5V......
  • doc设置背景图片
    文字处理现在工作环境用的是wps,不快是得扫码登录,能用即可,word老久没用过了,原理是一样的,简称doc文档。碰到一个需求,需要在固定格式得标签上打印,标签比较密,行列不能误差明显。想了想,得有个模,扫描标签得到一个jpg图片,再把图片设置背景。开始是使用doc的插入图片功能,发现设置成了最底......
  • 生产环境ActiveMQ调优方案
    一、使用线程池代替大量线程修改bin/env,设置ACTIVEMQ_OPTS。ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS_MEMORY-Dorg.apache.activemq.UseDedicatedTaskRunner=false-Djava.util.logging.config.file=logging.properties-Djava.security.auth.login.config=$ACTIVEMQ_CONF/login.confi......
  • dbt return macro 内部实现简单说明
    jinja2默认是没有returnmacro的,dbt在实现的时候比较有意思,通过一个exception触发的,以下是简单说明参考使用一个包含return的macro{%macrodemoapp(name,version)%}{%ifversion=='v1'%}{{return("appdemo")}}{%else%}......
  • cloudquery 开源ETL 框架
    cloudquery开源ETL框架提供了基于plugin的数据集成模式包含的特性开源,提供了sdk快速,基于golang轻量级协程,基于apachearrow部署方便,就是一个独一的二进制文件可扩展,cloudqueryplugin是无状态的,可以方便的扩展说明cloudquery可以应用的场景还是比较多的,但是目前一......
  • 超实用!10条JavaScript这20年来增加的新功能!
    部门捞人,前端可投:https://jinshuju.net/f/o38ijj在过去的20年里,JavaScript经历了多次更新和升级,引入了许多新功能以增强其表达力、交互性和开发效率。以下是一些显著的新功能:**1.ECMAScript6(ES6)**:这是JavaScript的一个重要更新,引入了箭头函数、模板字符串、解构赋值、默认......
  • jinja2 通过Template. make_module 进行动态macro 创建以及macro 方法调用
    实际属于一个小技巧,可以实现比较灵活的jinja2扩展,是从dbt对于macro的处理部分学习到的参考代码app.pyfromjinja2importEnvironment env=Environment() #定义macro的内容macro_template="""{%macromydemo(name,age)-%}{{name......
  • 华为云亮相KubeCon EU 2024,以持续开源创新开启智能时代
    本文分享自华为云社区《华为云亮相KubeConEU2024,以持续开源创新开启智能时代》,作者:华为云头条。近日,在巴黎举办的云原生顶级峰会KubeConEU2024上,华为云首席架构师顾炯炯在“CloudNativexAI:以持续开源创新开启智能时代”的主题演讲中指出,云原生和AI技术的融合,是推动产业......