如果事件在第一次未完成处理

时间:2018-06-11 12:46:31

标签: c# event-handling serial-port

我的问题是关于来自DataReceived的{​​{1}}事件。我有一个方法,当该事件发生时被调用。我用System.IO.SerialPort读取数据,处理并保存。如果我获得特定字符,那么直到该点的数据将被解释为命令并触发另一个事件。

我的问题是,如果我在处理收到的数据和新数据的过程中会发生什么?该方法的新实例是否等待旧的完成?如果不是,则可能导致冲突,因为该方法的两个实例都使用相同的变量。我在事件处理的概念上是错误的还是有一种优雅的方式来处理它。

我的代码运行正常,我的结果符合预期,但我的数据处理并不复杂。我只想了解这个问题,避免将来遇到问题。 我的代码示例如下:

myPort.ReadExisting

这些列表是因为我希望它可以使用多个端口来获取命令。

2 个答案:

答案 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>类,它可以作为这种生产者/消费者关系的便捷队列。

您可能会选择深入挖掘数据流。它非常适合异步世界中的制作人/消费者。

从这里开始:https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-write-messages-to-and-read-messages-from-a-dataflow-block