冻结窗口窗体应用程序与复选框c#

本文关键字:复选框 应用程序 窗口 窗体 冻结 | 更新日期: 2023-09-27 18:03:23

这是我的情况,当我选中复选框,我的应用程序冻结,但仍然工作。这意味着它仍然能够识别通过串行端口发送的数据;对于测试目的,它只是退出应用程序。

如果我注释掉第45行("pipe = arduino.ReadLine();"见下面的截图),这意味着它不再需要"ReadLine()",我可以取消选中该框。然而,现在当我试图重新检查框,我得到一个错误消息说"访问端口'COM5'被拒绝"

我假设代码不能继续,因为当还没有发送任何东西时,它正在尝试"ReadLine()"。然而,我没有被拒绝访问COM端口的解释;而不是当端口已经打开时,我试图打开它。

private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        SerialPort arduino = new SerialPort();
        arduino.BaudRate = 9600;
        arduino.PortName = comboBox1.Text;
        string pipe;
        if (checkBox1.Checked)
        {
            checkBox1.Text = "Listening...";
            arduino.Open();
                pipe = arduino.ReadLine();
                if (pipe == "S'r")
                {
                    //System.Diagnostics.Process.Start("shutdown", "/f /r /t 0");
                    System.Windows.Forms.Application.Exit();
                }
        else
        {
            checkBox1.Text = "Start";
        }
    }
}

冻结窗口窗体应用程序与复选框c#

SerialPort类管理系统资源,当涉及到这些敏感对象时,该类通常实现IDisposable接口,以允许这些系统资源立即释放到系统。

您的代码忘记关闭SerialPort,因此,下次您的用户操作导致调用此事件处理程序时,该端口正在被您自己的第一个操作使用。

幸运的是,有一种简单的方法可以确保正确关闭和处理这样的对象,那就是using语句

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if (checkBox1.Checked)
    {
        checkBox1.Text = "Listening...";
        using(SerialPort arduino = new SerialPort())
        {
           arduino.BaudRate = 9600;
           arduino.PortName = comboBox1.Text;
           string pipe;
           arduino.Open();
           pipe = arduino.ReadLine();
           if (pipe == "S'r")
           {
                //System.Diagnostics.Process.Start("shutdown", "/f /r /t 0");
                //System.Windows.Forms.Application.Exit();
           }
       } // Here the port will be closed and disposed.
    }
    else
    {
        checkBox1.Text = "Start";
    }
}