我正在编写一个需要与串口通信的程序。我主要关心的是防止冲突并确保不会同时从不同的功能写入/读取。
首先,有一个系统定时器从头开始,用于定期向串口写入数据,并通过给定的超时值监听响应。因此,它将有一个 Elapsed Event 并完成工作。
其次,还有另一个功能具有更高的优先级,需要立即将数据写入串行端口。
场景 1. Elapsed 事件每 1 分钟触发一次,如果仍然挂起前一个事件或 SendImmediately 函数,则永远不会继续。
场景 2. 如果 SendImmediately 被调用,则需要等待当前正在运行的 OnTimedEvent 完成。同样, OnTimedEvent 的下一次运行将停止,直到 SendImmediately 完成。
问题。如何在上一个或 SendImmediately 完成之前阻止 OnTimedEvent 的下一次运行?基本上是为了防止它们之间的干扰。
我在这里进行了一些问答。有很多建议的答案,如下所示:
- 禁用和启用计时器
- AutoResetEvent(2 路信号)
- 手动复位事件
- Monitor.Enter / Monitor.Exit(锁定)
- 队列
- 睡眠/加入/Task.Wait(阻塞)
我没有坚实的基础来确定哪种方法对我来说是正确或合适的,因为每种方法都有不同的场景。非常感谢任何建议。
public System.Timers.Timer aTimer = new System.Timers.Timer(Properties.Settings.Default.Interval * 60 * 1000);
public bool InitialTimer(int interval, bool action)
{
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = interval;
aTimer.Enabled = action;
GC.KeepAlive(aTimer);
return action;
}
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
// write something to serial port
}
public void WriteImmediately()
{
// write something to serial port
}