Надежная ручка закрыта - множество вариантов исправлений
У меня есть частная функция, которая создает новый последовательный порт и открывает его. Время от времени я получаю исключение "Безопасный дескриптор закрыт", которое завершает работу приложения. Теперь я прочитал несколько дополнительных исправлений и хотел бы узнать из вашего опыта, что может быть реальной проблемой в моем коде.
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;
Спасибо!
1 ответ
Я думаю, что вы можете отказаться от вариантов 2) и 3).
Номер один является возможным кандидатом, но не достаточно кода, чтобы быть уверенным: если нет других ссылок на ваш SerialPort
становится кандидатом на сборку мусора. После сбора мусора любая попытка получить к нему доступ приведет к исключению, хотя я ожидаю NullReferenceException
,
Может быть и другая причина: если ваш последовательный порт эмулируется, например, через USB-устройство, и это устройство удаляется во время работы вашего приложения, основное соединение будет удалено. Когда вы пытаетесь использовать SerialPort
в вашем приложении после того, как это произошло, вы получите исключение "безопасный дескриптор был закрыт".