安全手柄已关闭 - 修复的众多选项

Posted

技术标签:

【中文标题】安全手柄已关闭 - 修复的众多选项【英文标题】:safe handle has been closed - numerous options to fix 【发布时间】:2017-09-10 09:03:58 【问题描述】:

我有一个私有函数,它创建一个新的串行端口并打开它。有时,我会收到“安全句柄已关闭”异常,这会终止应用程序。现在,我一直在阅读一些可选的修复程序,并想从您的经验中了解,我的代码中真正的问题可能是什么。 1)需要在这个私有函数的范围之外定义_serialPort变量。 2) 串口的 readTimeout 属性不应该是无限的。 3) 上面的 using 语句处理我的 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;

谢谢!

【问题讨论】:

您的代码的真正问题是它没有发布在您的问题中。 @Guy,现在,有一个问题。谢谢。 哪一行抛出异常? 请包含整个类。如果将 _serialPort = new SerialPort(); 更改为 var _serialPort = new SerialPort(); 会发生什么? @mjwills,这种类型的异常没有堆栈跟踪。将类型更改为 var 应该做什么? 【参考方案1】:

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

第一个是可能的候选者,但没有足够的代码可以确定:如果没有其他对您的 SerialPort 的引用,它将成为垃圾收集的候选者。一旦它被垃圾收集,任何访问它的尝试都会导致异常,我希望NullReferenceException

可能还有另一个原因:如果您的串行端口被模拟,例如一个 USB 设备,并且该设备在您的应用程序运行时被删除,底层连接将被释放。 当您尝试在您的应用程序中使用SerialPort 之后,您将收到“安全句柄已关闭”异常。

【讨论】:

谢谢,设备没有被移除,所以它可能是第一个解决方案。由于它不会一直发生,因此我只需要等待并检查问题是否随着新修复程序而再次出现。谢谢!

以上是关于安全手柄已关闭 - 修复的众多选项的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS:处理空间导航(键盘和游戏手柄)[关闭]

如何修复 Vue 3 中的“错误:未知选项:devServer”[关闭]

密码重置安全选项 - 这两个选项中的哪个更安全[关闭]

为啥老显示导航已取消?

如何关闭跨站点脚本 (XSS) 筛选器

在修复画笔工具的工具选择栏中有很多选项,下列说法错误的是()。