安全手柄已关闭 - 有许多修复选项
safe handle has been closed - numerous options to fix
我有一个私有函数可以创建一个新的串口并打开它。有时,我会收到终止应用程序的 "Safe handle has been closed" 异常。现在,我一直在阅读一些可选的修复程序,并想根据您的经验了解我的代码中真正的问题是什么。
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;
谢谢!
我认为您可以放弃选项 2) 和 3)。
第一个是可能的候选者,但没有足够的代码可以确定:如果没有其他引用对您的 SerialPort
它成为垃圾收集的候选者。一旦它被垃圾收集,任何访问它的尝试都会导致异常,我希望 NullReferenceException
.
可能还有另一个原因:如果您的串口是通过例如一个 USB 设备,当您的应用程序处于 运行 时该设备将被移除,底层连接将被释放。
发生这种情况后,当您尝试在应用程序中使用 SerialPort
时,您将得到 'safe handle has been closed' 异常。
我有一个私有函数可以创建一个新的串口并打开它。有时,我会收到终止应用程序的 "Safe handle has been closed" 异常。现在,我一直在阅读一些可选的修复程序,并想根据您的经验了解我的代码中真正的问题是什么。
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;
谢谢!
我认为您可以放弃选项 2) 和 3)。
第一个是可能的候选者,但没有足够的代码可以确定:如果没有其他引用对您的 SerialPort
它成为垃圾收集的候选者。一旦它被垃圾收集,任何访问它的尝试都会导致异常,我希望 NullReferenceException
.
可能还有另一个原因:如果您的串口是通过例如一个 USB 设备,当您的应用程序处于 运行 时该设备将被移除,底层连接将被释放。
发生这种情况后,当您尝试在应用程序中使用 SerialPort
时,您将得到 'safe handle has been closed' 异常。