c# - 事件处理程序触发两次

标签 c# events handler

我是一名工科学生,目前正在研究我的最后一年项目。我正在尝试用 C# 构建一个基于 rfid 的 parking 场管理系统。根据一些研究,我编写了以下代码来从 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() 语句来测试它,它会显示消息两次。我该如何解决这个问题?

最佳答案

在 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 Class

Environment.StackTrace Property

How to: Use the Call Stack Window

关于c# - 事件处理程序触发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27608156/

相关文章:

c# - 名为 'MS_attributerouteWebApi' 的路由已经在路由集合中

c# - 在 C# 中的 SQL 查询中将字符串数组作为参数传递

javascript - GoJS 图 - 获取双击的对象

java - 如何自动隐藏 GWT MenuBar 子菜单?

javascript - 斜杠命令 "unknown interaction"

c# - 如何让 PrettyBin 不将 PDB 文件复制到 lib 文件夹以显示异常行号?

c# - 如何记住使用返回值?

javascript - DOM Mutation Observers 是否比 DOM Mutation Events 慢?

java - setOnItemSelectedListener 上下文

android - 每 10 秒运行一次 AsyncTask 直到被取消