>我有三个类,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()
怎么办?
我的建议: 让通信处理资源,或者主管负责它们的构建和销毁。