首页 > 解决方案 > 重复同步过程准确计时的最佳实践?

问题描述

我的大部分专业重点是集成各种硬件以形成用于工业自动化的连续状态机。通常,这些应用程序需要以规则和准确的频率(<60Hz)“无限期地”循环同步动作的工作流程。

作为一名自学成才的开发人员,迄今为止我采用了两种技术,但我认为这两种技术都不正确:

1. 有延迟的专用线程

是否BackgroundWorker或等效,伪:

  1. 将所需定义period为频率倒数。
  2. 运行该过程,定时System.Diagnostics.Stopwatch或等效。
  3. 将正在运行的线程延迟period - elapsed. 注意:elapsed可能不一致,但总是小于period
  4. 环形

我不喜欢这个的原因:

  1. 线程延迟... eww。
  2. 维护计时器感觉管理过度,而且很麻烦。

2. System.Timers.Timer.Elapsed

使用System.Timers.Timer类:

  1. Interval设置period为频率倒数。
  2. Elapsed事件处理该过程。

我不喜欢这个的原因:

  1. 经常出现跨线程问题
  2. 延迟的流程实例(例如由于意外的数据加载或网络延迟)可能导致异步操作。

问题

在这些情况下,哪些模式/方法被认为是最佳实践?原谅冗长的细节,我将不胜感激考虑建议。

非常感谢

标签: c#synchronizationstate-machine

解决方案


如果您熟悉 IObservable 和 System.Reactive.Linq,则可以使用 Observable.Interval。如果你想实现一些自定义线程调度,它也有一个接受 IScheduler 参数的重载,但默认线程调度在大多数情况下工作得很好。冒着冗余的风险,Observable.Interval 完全按照您的想法做:在 TimeSpan 参数指定的时间间隔内连续调用回调委托。

Observable.Interval(TimeSpan.FromSeconds(1/60)).Subscribe(_ => {
    // do stuff
});

推荐阅读