news 2026/11/5 12:39:55

`Volatile.Read` 是否是问题原因

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
`Volatile.Read` 是否是问题原因

1.Volatile.Read是否是问题原因

Volatile.Read是一种“带内存可见性保证的读取”。

Action<int,string>?handler=Volatile.Read(ref_faultRunLightRedSolidHandler);

它主要保证:

  • 其他线程刚通过Interlocked.Exchange注册的新处理器能够被及时看见。
  • 编译器和 CPU 不会随意重排这次读取前后的内存操作。
  • 读取本身不会加锁,也不会等待。
  • 不会启动线程,也不会执行 PLC 操作。

当前代码是:

Interlocked.Exchange(ref_faultRunLightRedSolidHandler,handler);

配合:

Volatile.Read(ref_faultRunLightRedSolidHandler)

这是合理的线程安全写法。Volatile.Read只负责取出委托,真正耗时的是后面的:

handler.Invoke(station,reason);

因此它不是 UI 卡顿原因。

但DataStorageError和PublishStationLog都存在同一个设计问题:它们在当前调用线程同步执行故障灯处理器。

  • DataStorageError
  • PublishStationLog

如果调用线程是 UI 线程,就会直接卡住 UI。

2. 针对 PLC 断电的最小优化计划

建议只做以下几项,不需要大规模重构。

第一项:故障灯动作改为后台执行

PublishStationLog和DataStorageError不要直接执行:

handler.Invoke(station,reason);

改成调用一个统一的后台投递方法,例如:

QueueFaultRunLightAction(station,reason);

该方法内部使用线程池执行,并捕获异常:

ThreadPool.QueueUserWorkItem(_=>{try{handler(station,reason);}catch(Exceptionex){DiagnosticError(station,$"故障报警写灯异常:{ex.Message}");}});

这样 PLC 即使等待 20 秒,也只会占用后台线程,不会阻塞 UI 线程。

建议增加“每站同时只允许一个写灯任务”,避免 PLC 断电时大量故障不断创建后台任务。

第二项:写灯前先判断 PLC 连接状态

在WriteFaultRunLightRedSolid中增加:

if(plc==null||!plc.IsConnected){LogHelper.DiagnosticError(stationIndex,$"故障报警未能写灯:辅控PLC未连接。原因={reason}");return;}

这可以避免已明确断线时仍然发起写操作。

但要注意:连接状态可能在检查后立即断开,因此仍必须保留写入失败处理。

第三项:红灯写失败后立即停止后续写入

当前代码即使红灯写失败,仍然继续写绿灯和黄灯,导致一次故障最多等待三次超时。

建议改成:

intresult=plc.WriteTowerRedSolid("红灯常亮");if(result!=0){LogHelper.DiagnosticError(stationIndex,$"故障报警写RUN红灯失败,返回码={result}。原因={reason}");return;}plc.WriteTowerGreenOff("异常之后关闭绿灯");plc.WriteTowerYellowSolid("异常之后黄灯亮");

设备已经断电时,三次写入没有实际意义,继续写只会增加等待时间。

第四项:修正红灯命令名称

当前方法名是WriteFaultRunLightRedSolid,但实际调用:

plc.WriteTowerRedBlinking("红灯常亮");

这会产生“名称说常亮,实际命令是闪烁”的问题。应该确认后改为:

plc.WriteTowerRedSolid("红灯常亮");

推荐执行顺序

  1. 先把故障灯写入移到后台线程,解决 UI 卡死。
  2. 增加IsConnected判断。
  3. 红灯失败立即返回,避免继续写绿灯、黄灯。
  4. 增加每站写灯任务去重。
  5. 修正WriteTowerRedBlinking与“红灯常亮”的语义不一致。

这样既保留了故障日志,也保留了 PLC 恢复后继续写灯的机会,同时不会因为 PLC 断电拖死 UI。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 18:16:56

Fiddler原理深度解析:HTTP代理与HTTPS解密机制

1. 抓包这件事&#xff0c;从来不是“点开软件就能看到所有流量”那么简单很多人第一次听说Fiddler&#xff0c;是在调试网页接口失败时被同事随口提了一句&#xff1a;“你用Fiddler抓个包看看请求发出去没&#xff1f;”——于是下载安装、打开软件、刷新页面&#xff0c;真就…

作者头像 李华
网站建设 2026/10/28 1:45:41

TikTok Shop 多店铺:平台侧哪些信息会被交叉比对

一、先说结论&#xff1a;官方对「关联」的定义&#xff0c;比你想的宽 TikTok Shop 官方在卖家学习中心有一篇《关联账号风险指南》&#xff0c;原文写得很直白——平台对关联账号的判定&#xff0c;通常不是依据单一的重合信息&#xff0c;而是多项风险信号综合判断&#xff…

作者头像 李华
网站建设 2026/10/31 10:30:57

混合办公时代,远程办公数据防泄露该如何建设

混合办公、居家办公、员工外勤已经成为常态。员工不再全部局限在公司内网办公&#xff1a;居家电脑、笔记本带回家、外勤出差&#xff0c;终端脱离企业内网环境。传统安全手段全部基于内网环境&#xff0c;电脑一旦带出公司&#xff0c;防火墙、内网管控全部失效。很多企业现状…

作者头像 李华
网站建设 2026/10/31 4:57:19

Python自动化处理Excel报表:从复制粘贴到定时任务

一个人每周能在重复操作上浪费多少时间&#xff1f;我以前没认真算过&#xff0c;直到被一个Excel汇总日报的任务反复折磨。每周五下午&#xff0c;我要把几份不同小组发来的日报文件手动合并到一张总表里&#xff0c;做格式统一、算一算汇总&#xff0c;再生成报告发出去。熟练…

作者头像 李华
网站建设 2026/11/1 16:01:04

Java+SSM+Django构建智能题库管理系统实战

1. 项目概述&#xff1a;在线题库管理系统的核心价值这个题库管理系统项目本质上是一个面向教育机构和企业培训部门的一站式试题资源管理平台。我见过太多学校还在用Excel管理试题&#xff0c;每次组卷都要手动筛选&#xff0c;不仅效率低下还容易出错。这套系统通过JavaSSMDja…

作者头像 李华