如果第一个事件未完成处理时再次发生,会发生什么情况

Sim*_*mon 5 c# serial-port event-handling

我的问题是关于DataReceived的事件System.IO.SerialPort。我有一个方法,当该事件发生时会被调用。我用 读取数据myPort.ReadExisting,处理它并保存它。如果我得到一个特定字符,则该点之前的数据将被解释为命令并触发另一个事件。

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

我的代码运行良好,结果符合预期,但我的数据处理并不那么复杂。我只是想了解这个问题并避免将来出现问题。我的代码示例是这样的:

private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

        SerialPort port = (SerialPort)sender;
        int index = m_ports.FindIndex(p => p.PortName == port.PortName);
        string tmpData;
        m_currentData[index] += tmpData = port.ReadExisting();
        Console.WriteLine(tmpData);

        string currentData = m_currentData[index];
        string currentOrder = "";
        while (currentData.Contains(orderEndChar))
        {
            int endCharLocation = currentData.IndexOf(orderEndChar);
            currentOrder = currentData.Substring(0, endCharLocation);
            currentData = currentData.Substring(endCharLocation + 1);
            orderEvent.gotOrder(currentOrder);
            //orderEvent.gotOrder(new EventArgs());
        }
        m_currentData[index] = currentData;

}
Run Code Online (Sandbox Code Playgroud)

这些列表是因为我希望它能够与多个端口一起使用,我可以从中获取命令。

Tom*_*ada 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