如何正确关闭串行端口连接并在其中运行线程
本文关键字:在其中 运行 线程 连接 串行端口 何正确 | 更新日期: 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();
}
}