Надежная ручка закрыта - множество вариантов исправлений

У меня есть частная функция, которая создает новый последовательный порт и открывает его. Время от времени я получаю исключение "Безопасный дескриптор закрыт", которое завершает работу приложения. Теперь я прочитал несколько дополнительных исправлений и хотел бы узнать из вашего опыта, что может быть реальной проблемой в моем коде. 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 в вашем приложении после того, как это произошло, вы получите исключение "безопасный дескриптор был закрыт".

Другие вопросы по тегам