c# - 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
{
}
}
但有时会出现'Safe Handle was Closed',所以程序异常终止。
如果没有“安全手柄已关闭”,我如何强制终止通信?
解决方案
看来你应该CoTH
先停下来,然后Serial
。或者你会残忍地终止CoTH
它,因为它正在使用Serial
而不知道它已经被处理掉了。
在你的课Communication
上。它一直在调用 Serial.Receive()。
public void Read()
{
lock(Serial.Synchronous)
{
while(condition...)
{
Serial.Receive();
// ....
}
}
}
但是,您的Stop
方法是Serial
在关闭通信逻辑之前处理资源CoTH
。
if (Serial != null)
Serial.Close();
if (CoTH != null)
CoTH.Abort();
你先关闭 Serial。如果关闭后Communication.Read()
想打电话怎么办?Serial.Receive()
我的建议:让通信处理资源,或者让主管负责它们的构建和销毁。
推荐阅读
- azure-cosmosdb - 无法将 Cassandra CQL shell 连接到 Azure-CosmosDB
- algorithm - 向量中的最大和,根据条件,由另一个向量定义
- c++ - 在 C++ 中读取 OutputDataStream.writeShort(int v)
- python - 如何使用 django 从 oracle 11g 中的不同模式访问表?
- ios - 针对 APP 或 IPA 文件运行 Appium 测试?
- java - 对 android 中的两个选项卡使用相同的 RecyclerView
- materialize - Materialise 始终显示响应式内容
- gnuplot - Gnuplot 仅在第一个数据行中解释语言环境小数点分隔符
- postsharp - PostSharp:如何装饰返回的 IEnumerable
? - ruby - 在异步作业中使用“睡眠”是否合理?