事件处理程序触发两次

时间:2014-12-22 18:10:39

标签: c# events handler

我是一名工科学生,目前正在完成我的最后一年项目。我正在尝试用C#构建一个基于rfid的停车场管理系统。基于一些研究,我已经编写了以下代码来读取rfid阅读器的数据,但我遇到了这个问题。事件处理程序
我用来读取收到的数据两次火灾,我不明白...我在互联网上做了一些研究,发现许多人面临类似的问题,事件处理程序两次射击,但大多数都是按钮 - 点击事件。我只能在自定义事件处理程序上找到一些线程,但这些解决方案似乎不适用于我的项目。这个问题的任何可能的解决方案?

private void Parking_layout_Load(object sender, EventArgs e)
{
    foreach (string port in System.IO.Ports.SerialPort.GetPortNames())
    {
        comboBox1.Items.Add(port);
        if (comboBox1.Items.Count > 0)
            comboBox1.SelectedIndex = comboBox1.Items.Count - 1;
    }

    RFID = new SerialPort();
    RFID.PortName = comboBox1.Text;
    RFID.BaudRate = 9600;
    RFID.DataBits = 8;
    RFID.Parity = Parity.None;
    RFID.StopBits = StopBits.One;
    RFID.Open();
    RFID.DataReceived += new SerialDataReceivedEventHandler(RFID_DataReceived);

}

private void RFID_DataReceived(object sender, SerialDataReceivedEventArgs e)
{            
    try
    {                
        tag_id = RFID.ReadExisting().ToString();              
        SetLabel(tag_id);                
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

RFID_DataReceived执行两次。如果我把一个messageBox.show()语句来测试它,它会显示两次消息。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

在RFID_DataReceived方法上设置一个断点,以便了解它为何被触发两次。然后,您可以查看堆栈窗口以查看代码的堆栈跟踪。

您也可以对原始方法Parking_layout_Load执行相同操作,以查看是否可能从另一段代码中调用一次。您还可以在函数内部放置代码,以便将堆栈跟踪写入输出窗口。

private void RFID_DataReceived(object sender, SerialDataReceivedEventArgs e)
{   Debug.WriteLine("StackTrace: '{0}'", Environment.StackTrace);         
    try
    {                
        tag_id = RFID.ReadExisting().ToString();              
        SetLabel(tag_id);                
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

有关更多详细信息,请使用此示例中的stacktrace类:StackTrace Class

Environment.StackTrace Property

How to: Use the Call Stack Window

答案 1 :(得分:-1)

什么是传入数据?看看你的代码,我注意到你有一行

RFID.DataBits = 8;

在.NET中,char是2个字节。如果您正在从设备中读取字符,那么实际上需要两次调用您的事件处理程序来处理所有16位。你能把这个值改成16吗?