UI 卡顿的直接原因是“故障日志同步写 PLC”,不是 `Volatile.Read` 或递归

发布时间:2026/10/14 3:25:46

UI 卡顿的直接原因是“故障日志同步写 PLC”,不是 `Volatile.Read` 或递归 结论UI 卡顿的直接原因是“故障日志同步写 PLC”不是Volatile.Read或递归。调用链如下实时采集结果通过Dispatcher.BeginInvoke回到 UI 线程执行StationControlViewModel.Realtime.cs。UI 线程调用PrintAuxControlErrorLog进入LogHelper.PublishStationLog。PublishStationLog同步执行注册的故障灯处理器。WriteFaultRunLightRedSolid连续调用三次同步 PLC 写入。PLC 写入经过EnqueueExecute锁和 Socket 收发失败时会等待超时Driver.cs、AuxPLC.cs。日志已经明确证明了这一点17:41:38.442 故障产生。17:41:59.453 红灯写失败约等待 21 秒。17:42:20.485 绿灯写失败再等待约 21 秒。17:42:41.545 黄灯写失败再等待约 21 秒。也就是说一条故障最多阻塞 UI 约 63 秒。5034、5035、5036 连续发生后UI 线程累计被阻塞约 171 秒。后续 5041、5043 在 PLC 已被判定断开后才快速返回所以日志时间相同。另外还有几个问题红灯写失败后仍继续写绿灯、黄灯放大了等待时间。只检查了红灯返回值绿灯和黄灯返回值被忽略。WriteFaultRunLightRedSolid实际调用的是WriteTowerRedBlinking名称和实际命令不一致。PublishFaultEvent在 PLC 三次写入之后才执行故障事件本身也会被延迟。建议的修复方向PublishStationLog中只投递故障灯请求不执行同步 PLC I/O。由每站一个后台单消费者队列处理灯塔写入并对同站故障进行合并/去重。三个连续地址尽量合并成一次 PLC 批量写入通讯失败后立即停止后续写入并标记 PLC 离线。按实际意图改为WriteTowerRedSolid并补充每次 PLC 写入的耗时和线程号日志。本次仅完成原因分析未修改代码。
延伸阅读

更多相关文章

2026/10/14 3:25:46

两千年历史 GDP 如何做到可复现?关键是估计来源标识

打开一个数据说明页时,“国家—年份—数值”的整齐结构很容易让人默认这是一份逐年官方实测。但时间跨度越长,这种默认越危险。DeepSData 的公开页面介绍,Maddison Project Database 覆盖长期人均 GDP 与人口估计,字段包括用于水平…

2026/10/14 3:25:46

【大数据毕设项目】基于Python的胆结石合并症风险预测与可视化系统研究\基于机器学习的胆结石症状特征分析与风险预测模型研究

文章目录 一、项目开发背景意义 二、项目开发技术 三、项目开发内容 四、项目展示 五、项目相关代码 六、最后 一、项目开发背景意义 胆结石作为一种常见的消化系统疾病,其发病机制与人体代谢、遗传及多种基础疾病密切相关。传统的临床数据分析往往局限于单一…

2026/10/14 3:25:46

Network架构2——Self-attention

我们在前面的讨论中输入的都是一个向量,那么如果输入的是多个向量(输入是一排向量时)应该如何处理呢?这就是本节课要解决的问题哪些场景的输入是需要用多向量表示呢?例如输入一个句子,每个单词可以看作一个…

2026/10/14 4:25:50

Stata矩阵计算入门:从matrix命令到Mata的进阶指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 4:25:50

考研数据结构复试高频考点、手写代码与面试应对策略

初试成绩出来之后,很多同学会陷入一种“不知道该干什么”的状态。刷题吧,好像复试不考这么细;看论文吧,又不知道从哪看起;真要准备机试,又发现手生的厉害。我自己当年备考“考研数据结构复试题目整理”的时…

2026/10/14 4:25:50

考虑主从配电网分布式优化的ADMM算法Matlab实现与串并行对比

最近在推进一个关于主从配电网分布式优化控制的课题时,核心目标是用交替方向乘子法(ADMM)把主网和多个配电子网之间的协同优化拆开做,整个算法在Matlab里落地,并对比了串行和并行两种执行机制下的收敛行为。从模型搭建…

2026/10/14 4:25:50

一次GC频繁问题排查:从JFR到代码优化的完整实践

大概一个多月前,我接到一条让我头疼不已的告警:某个订单查询接口的 P99 延迟从平时的 80ms 一路飙到 800ms 以上,CPU 使用率每隔几分钟就像过山车一样冲到接近 100%。一开始我照例查了流量、数据库慢查询、第三方依赖,全都没有异常…

2026/10/14 4:20:49

在ESP32上构建应用商店:模块化固件架构与动态加载实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/13 17:09:18

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/14 0:00:33

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述:为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中,我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点,结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介:这是一套遵循SCORM标准的交互式课件演示与测试资源,面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者,用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件,约12.07MB,以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑