如何正确关闭串行端口连接并在其中运行线程

本文关键字:在其中 运行 线程 连接 串行端口 何正确 | 更新日期: 2023-09-27 18:26:14

我在后台线程上运行了一个串行端口读取,但每次我试图关闭它时,都会遇到异常。通常是IO异常。

就好像即使我合上了线,阅读仍在继续。

这是我当前的代码:

编辑:我更改了代码,删除了对threatstate的检查。

public bool Connect(string portName)
    {
        try
        {
            sp = new SerialPort(portName, BaudRate);
            sp.Open();
            sp.DtrEnable = true;
             cf = SingletonFormProvider.GetInstance<ConnectionForm>(null);
            _continue = true;
            readThread = new Thread(Read);
            readThread.Start();
            return true;
        }
        catch(Exception ex)
        { 
            MessageBox.Show(ex.Message);
            return false;
        }
    }
    public void Disconnect()
    {
        if (IsConnectionOpen)
        {
            _continue = false;
            readThread.Abort();
            while (readThread.ThreadState == ThreadState.AbortRequested)
            { }
            sp.Close();
            readThread.Join();
        }
    }
    private void Read()
    {
                while (_continue)
                {
                    try
                    {
                        string message = sp.ReadLine();
                        cf.WriteLog(message);
                    }
                    catch (Exception ex)
                    {
                            MessageBox.Show(ex.Message);
                            _continue = false;
                            readThread.Join();
                            sp.Close();
                    }
            }

    }

如何正确关闭串行端口连接并在其中运行线程

你知道什么线程。Abort()是在有问题的线程中抛出ThreadAbortException,对吧?在线程中,您可以捕获从Exception继承的所有异常。我认为这包括中止异常。如果你真的必须调用Abort,你可能想先关闭串行端口,因为我相信这会导致任何挂起的调用返回。

在关闭串行端口之前加入您的读取线程:

public void Disconnect()
{
    if (IsConnectionOpen)
    {
        _continue = false;
        readThread.Join();
        sp.Close();
    }
}