我在后台线程上运行了一个串口读取,但每次我尝试关闭它时,都会出现异常。通常是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();
}
}
}
答案 0 :(得分:2)
你知道thread.Abort()所做的是在有问题的线程中抛出一个ThreadAbortException,对吧?在该线程中,您将捕获从Exception继承的所有异常。我相信这包括中止例外。如果你真的必须调用Abort,你可能需要先关闭串口,因为我认为这会导致任何待处理的呼叫返回。
答案 1 :(得分:0)
在关闭串口之前加入读线程:
public void Disconnect()
{
if (IsConnectionOpen)
{
_continue = false;
readThread.Join();
sp.Close();
}
}