C# 线程中止发生 'Safe Handle been Closed'
C# Thread Abort Occur 'Safe Handle been Closed'
我有三个class,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
{
}
}
但有时会出现'Safe Handle been Closed',所以程序异常终止。
如何在没有'Safe Handle been Closed'的情况下强制终止通信?
看来你应该先停CoTH
再停Serial
。或者您将残酷地终止 CoTH
,因为它正在使用 Serial
而不知道它已被处置。
在你的 class 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();
您先关闭Serial。如果 Communication.Read()
想在你关闭后调用 Serial.Receive()
怎么办?
我的建议:
让 Communication 处理资源,或者主管负责构建和销毁。
我有三个class,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
{
}
}
但有时会出现'Safe Handle been Closed',所以程序异常终止。
如何在没有'Safe Handle been Closed'的情况下强制终止通信?
看来你应该先停CoTH
再停Serial
。或者您将残酷地终止 CoTH
,因为它正在使用 Serial
而不知道它已被处置。
在你的 class 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();
您先关闭Serial。如果 Communication.Read()
想在你关闭后调用 Serial.Receive()
怎么办?
我的建议: 让 Communication 处理资源,或者主管负责构建和销毁。