【发布时间】:2022-01-23 17:30:41
【问题描述】:
我的天文台中有许多硬件组件,它们通过 USB、COM、LAN 等连接到一台主控 PC。
主控软件应定期轮询该硬件的状态(例如每 5 秒),但软件也应向硬件发送命令(例如“关灯”、“移动望远镜”……)。这可以手动或脚本完成。 编程环境是.NET。
我目前不确定如何防止或分离“定期轮询”和“用户交互”这 2 个例程,以防止并行访问单个硬件组件。定期轮询目前是通过后台工作人员完成的(因为硬件也可能会停止并且不应阻止来自其他组件的轮询),但是在硬件上的轮询完成之前等待用户交互的最佳方式是什么?
互斥体?锁?异步?等待?后台工作者是个好主意吗?
【问题讨论】:
-
我在定制硬件上也遇到过类似的情况——我最终创建了一个队列来将命令排队到硬件。
-
遗憾地要求最佳实践可能会引起基于意见的答案,从而使这个有趣的问题偏离主题。我建议为三个组件(池、队列、UI)中的每一个组件单独执行一个可执行文件,以确保您可以在发生故障时重置某些内容。
-
Async 和 await 与此没有直接关系。您可能仍想使用它们,但它们与锁定或阻止并发访问没有任何关系。
-
防止重叠执行的最简单方法是使用
lock语句。您可以为要保护的所有设备(最简单)使用共享的“储物柜”对象,或者如果您想最小化争用,则可以为每个设备使用专用储物柜。您只需要遵守纪律,每次要与设备交互时始终获取正确的锁。
标签: c# vb.net parallel-processing mutex hardware