C# 线程中止发生"安全句柄已关闭"



>我有三个类,Main,UserSerial,Communication

在主

Communication Comm;
Thread CoTH;
UserSerial Serial;
private void btnStart_Click(object sender, EventArgs e)
{
CoTH = new Thread(() =>
{
commJob();
});
CoTH.Start();
}
private void commJob()
{
Serial.Setting();
Serial.Open();
Comm = new Communication(Serial);
Comm.StartConnection(); 
}

在传播中

UserSerial Serial;
public Communication(UserSerial Serial)
{
this.Serial = Serial;
}
public void Read()
{
lock(Serial.Synchronous)
{
while(condition...)
{
Serial.Receive();
// .... 
}
}   
}

而且UserSerial不是我的代码,所以我不知道细节。

无论如何,当我想终止串行通信强制时,我在main中使用Thread.Abort((。

private void btnStop_Click(object sender, EventArgs e)
{
try
{
if (Serial != null)
Serial.Close();
if (CoTH != null)
CoTH.Abort();
}
catch
{
}
}

但有时它会发生"安全句柄已关闭",因此程序异常终止。

如何在没有"安全手柄已关闭"的情况下终止通信力?

看来你应该先停止CoTH,然后再停止Serial。否则你会残酷地终止CoTH因为它正在使用Serial而不知道它已被处置。

在你的课堂上Communication.它一直在调用 Serial.Receive((。

public void Read()
{
lock(Serial.Synchronous)
{
while(condition...)
{
Serial.Receive();
// .... 
}
}   
}

但是,您的Stop方法是在关闭通信逻辑CoTH之前释放资源Serial

if (Serial != null)
Serial.Close();
if (CoTH != null)
CoTH.Abort();

您先关闭串行。如果Communication.Read()想在您关闭它后呼叫Serial.Receive()怎么办?

我的建议: 让通信处理资源,或者主管负责它们的构建和销毁。

最新更新