Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确关闭串行端口连接并使其运行在线程中?_C#_Serial Port - Fatal编程技术网

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

C# 如何正确关闭串行端口连接并使其运行在线程中?,c#,serial-port,C#,Serial Port,我有一个在后台线程上运行的串口读取,但每次我试图关闭它时,都会出现异常。通常是IO异常 这就好像即使我关闭线程,阅读仍在继续 这是我当前的代码: 编辑:我更改了代码,删除了对threatstate的检查 public bool Connect(string portName) { try { sp = new SerialPort(portName, BaudRate); sp.Open();

我有一个在后台线程上运行的串口读取,但每次我试图关闭它时,都会出现异常。通常是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();

                    }

            }


    }
public bool Connect(字符串端口名)
{
尝试
{
sp=新串行端口(端口名、波特率);
sp.Open();
sp.DtrEnable=true;
cf=SingletonFormProvider.GetInstance(null);
_继续=真;
readThread=新线程(已读);
readThread.Start();
返回true;
}
捕获(例外情况除外)
{ 
MessageBox.Show(例如Message);
返回false;
}
}
公共空间断开连接()
{
如果(断开连接)
{
_continue=false;
readThread.Abort();
while(readThread.ThreadState==ThreadState.AbortRequested)
{ }
sp.Close();
readThread.Join();
}
}
私有void Read()
{
while(_continue)
{
尝试
{
字符串消息=sp.ReadLine();
cf.WriteLog(消息);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
_continue=false;
readThread.Join();
sp.Close();
}
}
}

您知道thread.Abort()的作用是在所讨论的线程中抛出ThreadAbortException,对吗?在线程中,您捕获从Exception继承的所有异常。我相信这包括中止例外。如果您确实必须调用中止,您可能需要先关闭串行端口,因为我相信这会导致任何挂起的调用返回。

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

public void Disconnect()
{

    if (IsConnectionOpen)
    {
        _continue = false;

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

异常错误消息是怎么说的?实际上现在它返回到VS2010,根本没有任何错误消息…问题解决了,那么!-)下次发生时,检查异常,它可能会为您指明正确的方向。不。。。问题没有解决。。。它在没有错误消息的情况下崩溃,但我只是更改了它并删除了threadstate检查,现在我收到一条错误消息,说“线程正在被中止”,好像它在_continue=false之前到达串行端口read,但在线程被中止之后。不,我没有。我删除了中止,虽然如此,但这次我还是得到了一个异常告诉我。“由于线程退出或应用程序请求,I/O操作已中止。”这强化了我的信念,即它在读取串行端口时获得了thread.join。这是在它可以检查_continue是否为false之前,但在线程加入之后。这使应用程序变得繁忙。它没有崩溃,但我无法与之互动。我仍然认为这是因为当它停止时实际的读取正在进行,我只是不知道如何防止它您的
\u continue
是如何声明的?您是否将其声明为易变的?此链接将帮助您: