【问题标题】:C# Thread Abort Occur 'Safe Handle been Closed'C# 线程中止发生“安全句柄已关闭”
【发布时间】: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


【解决方案1】:

看来您应该先停止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();

你先关闭 Serial。如果Communication.Read() 想在你关闭后调用Serial.Receive() 怎么办?

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

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 2010-11-22
    • 2014-01-09
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多