如何正确关闭串口连接和运行的线程?

时间:2012-03-01 20:50:55

标签: c# serial-port

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

就像我关闭线程一样,继续读取就好了。

这是我目前的代码:

编辑:我更改了代码,删除了对威胁状态的检查。

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();

                    }

            }


    }

2 个答案:

答案 0 :(得分:2)

你知道thread.Abort()所做的是在有问题的线程中抛出一个ThreadAbortException,对吧?在该线程中,您将捕获从Exception继承的所有异常。我相信这包括中止例外。如果你真的必须调用Abort,你可能需要先关闭串口,因为我认为这会导致任何待处理的呼叫返回。

答案 1 :(得分:0)

在关闭串口之前加入读线程:

public void Disconnect()
{

    if (IsConnectionOpen)
    {
        _continue = false;

        readThread.Join();
        sp.Close();
    }
}