我的问题是关于来自DataReceived
的{{1}}事件。我有一个方法,当该事件发生时被调用。我用System.IO.SerialPort
读取数据,处理并保存。如果我获得特定字符,那么直到该点的数据将被解释为命令并触发另一个事件。
我的问题是,如果我在处理收到的数据和新数据的过程中会发生什么?该方法的新实例是否等待旧的完成?如果不是,则可能导致冲突,因为该方法的两个实例都使用相同的变量。我在事件处理的概念上是错误的还是有一种优雅的方式来处理它。
我的代码运行正常,我的结果符合预期,但我的数据处理并不复杂。我只想了解这个问题,避免将来遇到问题。 我的代码示例如下:
myPort.ReadExisting
这些列表是因为我希望它可以使用多个端口来获取命令。
答案 0 :(得分:3)
在辅助线程上调用SerialPort.DataReceived。
在这里阅读:
https://msdn.microsoft.com/fi-fi/library/system.io.ports.serialport.datareceived(v=vs.110).aspx
因此,如果您有许多SerialPort实例正在侦听,则可能会有更多的Port_DataReceived
方法同时运行。但是不要害怕局部变量,因为它们只存在于特定的方法调用中。因此,运行相同方法的3个不同线程将启动3个不同的局部变量,即使它们的名称相同。但要小心全局变量。
由于Port_DataReceived
是同步的,因此同一 SerialPort
对象上的下一个事件调用将等待,以便逐个执行这些调用。
答案 1 :(得分:0)
因此,如果您怀疑生产者的运行速度可能超过消费者,那么您应该通过使用队列将两者分离。
你的生产者所要做的就是将收到的数据推送到(线程安全的)队列......一个不会溢出的快速操作。
所有消费者必须做的就是从队列中读取,按照自己的速度。
TPL Dataflow提供了BufferBlock<T>
类,它可以作为这种生产者/消费者关系的便捷队列。
您可能会选择深入挖掘数据流。它非常适合异步世界中的制作人/消费者。