首页 > 解决方案 > 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',所以程序异常终止。

如果没有“安全手柄已关闭”,我如何强制终止通信?

标签: c#serial-portthread-safety

解决方案


看来你应该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()

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


推荐阅读