【发布时间】:2020-05-14 01:14:13
【问题描述】:
我有三个类,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 was Closed',所以程序异常终止。
如果没有“安全手柄已关闭”,我如何强制终止通信?
【问题讨论】:
-
Thread.Abort使事物处于未定义状态...您真的关心其中一个是否正在终止您的应用程序吗? -
我以为是Thread.Abort()导致的,因为点击btnstop的时候出错了。
-
Safe Handle been Closed是个例外吗?它是否显示您的程序何时崩溃? -
看来你应该先停止
CoTH,然后再停止Serial。否则你将残酷地终止CoTH,因为它正在使用Serial。想象一下,当其他人继续调用它时,您终止了套接字。
标签: c# serial-port thread-safety