成长中的林 2024-05-08 09:49 采纳率: 75%
浏览 9
已结题

线程问题判断多次进入


  while (IsLoad1)
                {
                    lock (open1Lock) 
                    {
                        Thread.Sleep(30);
                        if (Model.TestItem.PistonState1 == 2)
                        {
                            Task.Delay(170);
                            dataSuctionResistance1.Add(Model.TestItem.SuctionResistance_Stabilization1);
                            dataConcentration1.Add(Model.TestItem.Concentration1);
                        }
                        else if (Model.TestItem.PistonState1 == 3&&Open1== Model.TestItem.PuffNumber1)
                        {
                            Open1++;
                                averageSuctionResistance1 = AverageSuctionResistance1(dataSuctionResistance1);
                                averageConcentration1 = AverageConcentration1(dataConcentration1);
                                sb.Append("Insert Into Lin_Data(ID,Place,TestTime,PuffNumber,SuctionResistance,Smokescope,TestResult,BarCode)\r\n");
                                sb.Append(string.Format("Values('{0}','{1}','{2}','{3}',\r\n", null, 1, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), Model.TestItem.PuffNumber1));
                                sb.Append(string.Format("'{0}','{1}','{2}','{3}');\r\n", Math.Round(averageSuctionResistance1,2), Math.Round(averageConcentration1,2), Model.TestItem.TestResult1 ? "OK" : "NG", Model.TestItem.BarCode1));
                                sListSql.Add(sb.ToString());
                                dataSuctionResistance1.Clear();
                                dataConcentration1.Clear();
                                Application.DoEvents();
                            //}
                        }
                    }

这一段代码只在一个线程内执行,按理来说else if (Model.TestItem.PistonState1 == 3&&Open1== Model.TestItem.PuffNumber1)这个判断只进入一次的因为进去之后Open1会++处理就不相等了但是,收集数据的过程中发现会进入多次也就是在执行Open1++前已经进入了多次为什么会出现这种情况

  • 写回答

10条回答 默认 最新

  • wanghui0380 2024-05-08 10:47
    关注

    代码不完整啊,没办法讨论,只能猜了。
    1.Open1 如何定义的我不知道。所以只能建议你别Open1++,使用原子操作Interlocked.Increment
    2.open1 请私有化。我无法判定是否有外面的东西会修改他。至于是否要静态化,我无法根据你代码判定,因为代码不完整,你也没有描述你要干嘛
    3.同理还有open1Lock 这个请私有 静态 readonly,保证他不会被修改
    4.可以使用threadLocal of T和 volatile声明 (好吧,这个编辑器文本不然打尖括号,泛型写不了,我写成 of T 你自己理解就好)

    当然我个人说,你这个代码我完全没理解他在干嘛。 假设你只是想控制open1,无论Interlocked.Increment,
    threadLocal of T
    ` 和 volatile都可以。根本无需lock

    同时lock是可重入锁,也就是同一个线程(按你说的就是一个线程)while(true)他本来就可重入。
    所以如果代码是同步代码,而且是只有一个线程,这个lock没有任何用处。本来就是就是执行完一次在循环。
    如果是异步代码,你用同步lock根本就lock不了。

    总体上我并没看懂,你为了一个线程(你反复强调他就一个线程),lock一个同步代码干啥?一个线程又没人跟他争抢,你lock他干嘛?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 5月16日
  • 已采纳回答 5月8日
  • 创建了问题 5月8日

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算