Повторное открытие и закрытие порта не рекомендуется.Проверьте раздел «Примечания» в статье библиотеки MSDN для SerialPort.Close ().Есть фоновый поток, который должен быть отключен, прежде чем порт может быть снова открыт, это занимает время.Время не предсказуемо.
Метод Close () может легко заблокироваться, если в данный момент выполняется обработчик события DataReceived.Самый типичный способ получить тупик - это вызвать Control.Invoke () в обработчике событий.Убедитесь, что вы не используете код в обработчике событий, который блокирует или требует переключения контекста потока.Использование BeginInvoke () - это нормально.
Невозможность уничтожить программу вызвана проблемой в драйвере устройства последовательного порта.Запустите Taskmgr.exe, вкладку «Процесс», «Просмотр + Выбор столбцов» и отметьте «Ручки».Если после уничтожения программы вы увидите столбец Handles, показывающий 1, то драйвер последовательного порта будет зависать от запроса ввода-вывода, который он не завершил.Процесс не может завершиться до тех пор, пока не завершатся все его потоки режима ядра.
С этой конкретной проблемой мало что можно сделать, кроме как надеяться на обновление драйвера или переключение на другого поставщика.Особенно эмуляторы последовательного порта USB печально известны наличием паршивых драйверов устройств.Вы избавляетесь от такого нарушителя спокойствия, когда вынимаете его с парковки и несколько раз перегоняете на машине.
Другая типичная проблема с эмуляторами USB заключается в том, что их так легко отключить во время использования,Это работает примерно так же, как извлечение флэш-накопителя из гнезда, пока Windows пишет в него.Также было бы хорошим способом повесить драйвер устройства. Версии .NET до версии 4.0 страдают от сердечного приступа в фоновом потоке, когда устройство внезапно исчезает.Недалеко от обновления, рядом с разъемом имеется небольшая табличка с надписью «Не отключайте во время использования!»это практический обходной путь.В любом случае, им будет скучно, но через пару раз.
Кстати, именно поэтому существует значок на панели задач «Безопасное извлечение устройства».Вы получите твердое "Не делай этого!"ошибка, если ваша программа использует используемый порт.Но, конечно, операционная система бессильна заставить пользователей фактически использовать ее.У Apple есть патент на методику, которая делает его безаварийным, обнаруживая пальцы пользователя на устройстве:)