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 处理资源,或者主管负责构建和销毁。