我专业关注的大部分是集成各种硬件以形成用于工业自动化的连续状态机。通常,这些应用需要同步操作的工作流程以规则和准确的频率(<60Hz("无限期"循环。
作为一名自学成才的开发人员,到目前为止,我已经使用了两种技术,我认为这两种技术都不正确:
1. 带延迟的专用线程
无论是BackgroundWorker
还是等效的,伪:
- 将所需的
period
定义为频率反转。 - 运行进程,计时
System.Diagnostics.Stopwatch
或等效项。 - 将正在运行的线程延迟
period - elapsed
。注意:elapsed
可能不一致,但始终小于period
。 - 圈
我不喜欢这个的原因:
- 线程延迟...呜呜。
- 维护计时器感觉管理过度且繁琐。
阿拉伯数字。系统.计时器.计时器.已过
使用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
});