ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-如果第一个未完成处理时再次发生事件会发生什么

2019-11-09 01:09:54  阅读:160  来源: 互联网

标签:event-handling serial-port c


我的问题是关于System.IO.SerialPort的DataReceived事件.我有一个方法,该事件发生时将被调用.我使用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;

}

列出这些是因为我希望它与可以从中获取命令的多个端口一起使用.

解决方法:

在辅助线程上调用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对象的下一个事件调用将等待,因此将逐个执行这些调用.

标签:event-handling,serial-port,c
来源: https://codeday.me/bug/20191108/2010487.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有