项目总结(丢包问题)

1.数据丢包问题

        在上一个项目中,仅使用程序对数据库操作读写,将所有数据压在一块然后发送是没有问题的,这样也节省很多不必要的麻烦。

        可是在现场环测试中,配合电气工程师做入库调试,当自动调用接口的脚本启动之后,会时不时有一些数据传输失败,出现很多数据丢失的情况,咨询之后发现,都是高并发的运行,会存在数据丢包,导致只有部分数据传输成功。

        还有一种可能是,多方对PLC地址块进行高频次的读写,会存在写入不成功的现象。处理的方法就是针对数据进行打补丁,然后加判断,针对必须数据,逐个判断数据完整性,然后将不全的数据进行补充,只有数据完全传输之后,才给电气发送完成信号,让电气进行下一步的逻辑。

20241230更新

2.异步数据访问异常问题

        在并发情况下,如果程序是异步状态,对数据库进行查询,可能导致返回的数据不是本次查询的东西。

 var configStation = _sysConfigRepository.Find(t => t.GroupCode == "Location" && t.SysFlag == YesOrNo.Yes).OrderBy(t => t.Remark).FirstAsync();

        修改方法为增加await标记,等待本次数据返回。绝绝子!

 var configStation = await _sysConfigRepository.Find(t => t.GroupCode == "Location" && t.SysFlag == YesOrNo.Yes).OrderBy(t => t.Remark).FirstAsync();
3.排序异常问题
var configStation = await _sysConfigRepository.Find(t => t.GroupCode == "Location" && t.SysFlag == YesOrNo.Yes).OrderBy(t => t.Remark).FirstAsync();

        以上代码的Remark为String类型,如果有两条数据,一条大于10,一条等于9,为什么选择的是大于10的数据。

        在 C# 和 .NET 环境中,当你对字符串进行排序时,默认是按照字典顺序(lexicographical order)进行的。这意味着字符串的排序是逐字符比较,从左到右,根据 Unicode 码点值进行排序。

        在你的例子中,如果 Remark 字段是字符串类型,并且你有两个值,一个是 "9",另一个是 "10",按照字典顺序排序:

  • "10" 在 "9" 之前,因为字符串比较是从第一个字符开始的。
  • 在比较 "10" 和 "9" 时,首先比较它们的第一个字符,即 '1' 和 '9'。
  • 在 ASCII 或 Unicode 表中,'1' 的值(49)小于 '9' 的值(57),但在字符串 "10" 和 "9" 的比较中,由于 "10" 以 '1' 开头而 "9" 以 '9' 开头,所以 "10" 被认为是较小的字符串,因此排在前面。

        这就是为什么在按 Remark 字段排序时,值为 "10" 的记录会排在值为 "9" 的记录之前的原因。

        一个可能的解决方案是在数据库层面处理这个问题,比如通过添加计算列或存储过程来转换和排序这些值。但在应用层面,你可以在应用逻辑中处理排序,或者尝试使用一种可以在 LINQ 查询中工作的方法,比如使用 OrderBy 和一个自定义的比较器,但这通常涉及到先将数据加载到内存中,这可能会影响性能。

var configStations = await _sysConfigRepository.Find(t => t.GroupCode == "Location" && t.SysFlag == YesOrNo.Yes).ToListAsync();
var sortedConfigStation = configStations.OrderBy(t => int.Parse(t.Remark)).First();

         还有一种方法为,将元素限制在10以内,当某一个元素大于10的时候,对所有Remark复制为0。

 if (i >= 10)
 {
     var configStation2 = _sysConfigRepository.Find(t => t.GroupCode == "Location" && t.SysFlag == YesOrNo.Yes).ToList();
     for (int j = 0; j < configStation2.Count; j++)
     {
         configStation2[j].Remark = j.ToString();
         await _sysConfigRepository.UpdateAsync(configStation2[j]);
     }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值