c# - 重复同步过程准确计时的最佳实践?
问题描述
我的大部分专业重点是集成各种硬件以形成用于工业自动化的连续状态机。通常,这些应用程序需要以规则和准确的频率(<60Hz)“无限期地”循环同步动作的工作流程。
作为一名自学成才的开发人员,迄今为止我采用了两种技术,但我认为这两种技术都不正确:
1. 有延迟的专用线程
是否BackgroundWorker
或等效,伪:
- 将所需定义
period
为频率倒数。 - 运行该过程,定时
System.Diagnostics.Stopwatch
或等效。 - 将正在运行的线程延迟
period - elapsed
. 注意:elapsed
可能不一致,但总是小于period
。 - 环形
我不喜欢这个的原因:
- 线程延迟... eww。
- 维护计时器感觉管理过度,而且很麻烦。
2. System.Timers.Timer.Elapsed
使用System.Timers.Timer
类:
Interval
设置period
为频率倒数。Elapsed
事件处理该过程。
我不喜欢这个的原因:
- 经常出现跨线程问题
- 延迟的流程实例(例如由于意外的数据加载或网络延迟)可能导致异步操作。
问题
在这些情况下,哪些模式/方法被认为是最佳实践?原谅冗长的细节,我将不胜感激考虑建议。
非常感谢
解决方案
如果您熟悉 IObservable 和 System.Reactive.Linq,则可以使用 Observable.Interval。如果你想实现一些自定义线程调度,它也有一个接受 IScheduler 参数的重载,但默认线程调度在大多数情况下工作得很好。冒着冗余的风险,Observable.Interval 完全按照您的想法做:在 TimeSpan 参数指定的时间间隔内连续调用回调委托。
Observable.Interval(TimeSpan.FromSeconds(1/60)).Subscribe(_ => {
// do stuff
});
推荐阅读
- python-3.x - 如何在 5 个元组中的元组列表中随机将变量质量更改为正负 delta
- c# - 改变 C# 中的事件的可见性?
- flutter - Flutter/Dart 从 JSON 中获取键的所有值
- mysql - 将信息从表添加到另一个
- java - Maven API search doesn't retrieve Google dependcies
- node.js - 缺少 `pino-pretty` 模块:`pino-pretty` 必须单独安装
- c# - 我使用用户帐户安全性在 Visual Studio 2022 中创建了一个新的 mvc 项目,但我使用了数据库脚手架命令来获取表
- compression - 对于网络相关的文本,Brotli 是否仅比 Gzip 更好?
- angular - 失败 ngrx 效果单元测试,其中效果标记为 { dispatch: false } 并且效果返回操作
- java - 使用覆盖方法比较排序