安全的手柄已关闭 - 修复的许多选择



我有一个私人功能,可以创建一个新的串行端口并打开它。我会不时地获得"安全的手柄已关闭"例外,该例外终止了应用程序。现在,我一直在阅读一些可选的修复程序,并想从您的经验中知道,我的代码中可能是真正的问题。1)需要在此私人功能范围之外定义_serialPort变量。2)串行端口的ReadTimeOut属性不应是无限的。3)上面的使用语句处理我的portName变量。

SerialPort _serialPort;
string[] devices = 
ConfigurationManager.AppSettings["GasAnalyzerDeviceName"].Split(',');
string portName;
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity"))
{
    portName = (from p in searcher.Get().Cast<ManagementBaseObject>()
                                let c = "" + p["Caption"]
                                where c != null
                                where devices.Any(d => c.Contains(d.Trim()))
                                from pn in SerialPort.GetPortNames()
                                where c.Contains(pn)
                                select pn).FirstOrDefault();
}
                if (portName == null)
                    portName = ConfigurationManager.AppSettings["GasAnalyzerPortName"];
                if (portName == null)
                    throw new Exception("Gas port not found");
                // Create a new SerialPort object with default settings.
                _serialPort = new SerialPort();
                // Set Serial port properties
                _serialPort.PortName = portName;
                _serialPort.BaudRate = 115200;
                _serialPort.DataBits = 8;
                _serialPort.Parity = Parity.None;
                _serialPort.StopBits = StopBits.One;
                _serialPort.Handshake = Handshake.None;
                _serialPort.ReadTimeout = Timeout.Infinite;//1200;
                _serialPort.WriteTimeout = 1200;

谢谢!

我认为您可以丢弃选项2)和3)。

第一是可能的候选人,但是没有足够的代码来确定:如果没有其他引用您的SerialPort,它将成为垃圾收集的候选人。收集垃圾后,任何访问它的尝试都会导致例外,我希望NullReferenceException很难。

可能还有另一个原因:如果您的串行端口是通过例如USB设备,并在应用程序运行时卸下该设备,将处理基础连接。当您尝试在应用程序中使用SerialPort时,您将获得"安全手柄已关闭"例外。

最新更新