2013-02-19 3 views
1

Я пытаюсь предотвратить любое странное поведение пользователей, использующих последовательное соединение в моем приложении.Неизвестный источник «Исключение IO было необработанным» во время закрытия приложения

Мое приложение подключается к устройству через USB-> последовательный преобразователь. После того, как я уверен, что порт доступен, подключен и готов, я настраиваю среду для передачи данных, но я также хочу быть готовым, если какой-либо пользователь отключит кабель связи, поэтому я использую следующий код.

try 
{ 
    serialPort.WriteLine("BT\r"); 
} 
catch (IOException ioe) 
{ 
    Console.WriteLine(ioe.Message); 
    currentCommunicationState = DEVICE_COMMUNICATION_STATES.IDLE; 
    // other stuff which set application in idle mode; buttons statuses, etc 
} 

Исключение выше обрабатывается хорошо. Приложения отправляются в режим ожидания, и я могу использовать его, но ... когда я закрываю приложение, я получаю следующее исключение без каких-либо уточнений.. Я не могу найти место, где выбрано это второе исключение или как сохранить эту ситуацию.

System.IO.IOException was unhandled 
Message="Specified port doesn't exist" 
Source="System" 
StackTrace: 
    w System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str) 
    w System.IO.Ports.SerialStream.Dispose(Boolean disposing) 
    w System.IO.Ports.SerialStream.Finalize() 
InnerException: 

Вход с консоли

Port 'COM29' nie istnieje. \\port COM28 doesn't exist - called from my exception handler 
A first chance exception of type 'System.IO.IOException' occurred in System.dll 
The thread 0x14d4 has exited with code 0 (0x0). 
The thread 0x1e98 has exited with code 0 (0x0). 
+0

Возможный дубликат [Освобождение отключенного виртуального последовательного порта] (http://stackoverflow.com/questions/9835881/releasing-a-unplugged-virtual-serial-port) –

+0

Также: http://stackoverflow.com/ Вопросы/3230311/problem-with-serialport/3230950 # 3230950 –

ответ

0

Когда первое исключение, вам нужно избавиться от SerialStream вы используете для общения. Исключением, которое вы получаете, является программа, пытающаяся избавиться от этого потока.

В обработчике исключений закройте поток последовательного порта.

+0

Но я не использую SerialStreamer - все, что я отправляю в этом случае/momenent, это просто BT \ r, который окончательно не отправляется. Затем я пытаюсь закрыть приложение. Итак, более подробно: Открытый порт Отправить BT // обработано Отсоединить кабель Закрыть приложение // не обрабатывается –

0

Похоже, что this post has some information о проблеме. Короче говоря, метод Dispose порта является ошибкой, так что он вызывает ошибки в финализаторе. ИМО это багги.

Если вы уверены, что выбрали все в нужное время, и вы все еще сталкиваетесь с этой проблемой, вы должны подклассифицировать класс Port, чтобы добавить более надежную обработку ошибок в переопределение метода Dispose(bool disposing). Вы можете обернуть вызов базового класса в бит try/catch.