2

我有一个项目,例如使用 RFID 的注册系统。当用户启用注册模式时,显示的每张卡应该只保存一次。为此,我使用了一个数组,然后检查数组中的相同代码以查看它是否已经存在。但是我在增加数组索引时遇到了问题。

在 Form1 类中,我进行了初始化:

string rx_data = "";
string last_data = "";
string[] availablePlayers = {""};
int plIndex = 0;

在下面的代码中,如果我使用plIndex,它只接收第一张卡片,并且似乎它停止再次调用此处理程序。

    public void WriteRxData(object sender, SerialDataReceivedEventArgs e)
    {
        if (connection.IsOpen && !cardSaveCon.IsOpen)
        {
            try
            {
                rx_data = connection.ReadLine(); // check how the data ends
               if (!availablePlayers.Any(rx_data.Contains))
                {
                    availablePlayers[plIndex] = rx_data;
                    receivedData.AppendText(rx_data);
                    plIndex++;
                }

            }
            catch (Exception err)
            {
                connection.Close();
            }
        }

但是,如果我使用硬编码的索引值,它就可以工作。我想知道如何处理这个问题,因为这必须适用于其他语言。我是 C# 的新手,所以我可能缺少一些部分。

4

1 回答 1

1
  availablePlayers[plIndex] = rx_data;

这将在您第二次收到字符串时使您的代码崩溃。不幸的是,您还捕获了 IndexOutOfRangeException 并关闭了端口。这将使代码完全死锁, SerialPort.Close() 只有在事件处理程序返回时才能完成。

具体对策:

  • 使用 aList<string>而不是 string[]
  • 从你的代码中删除 try/catch,它什么也做不了,只会让你的程序失败而无法恢复
  • 为 AppDomain.CurrentDomain.UnhandledException 编写一个事件处理程序,以便在您的程序因意外异常而死时提供诊断
  • 熟悉 Debug + Windows + Threads 调试器窗口。它允许您查看其他线程中发生的情况,您会看到死锁。
于 2013-07-21T15:30:40.980 回答