.Net SerialPort все еще заблокирован после закрытия приложения - PullRequest
1 голос
/ 21 сентября 2010

У меня есть приложение, которое вызывает SerialPort.Open () ... Это отлично работает, и данные считываются / записываются через порт.Однако, если пользователь решает уничтожить приложение через TaskManager, приложение будет закрыто без вызова моего деструктора, вызывающего SerialPort.Close ().

Это, в свою очередь (только иногда), вызывает следующую ошибку:

Доступ к порту 'COM2' запрещен.

Это происходит при повторном запуске приложения.Я прочитал достаточно сообщений, чтобы знать, что этого не произойдет, если .Close () будет правильно вызван.До сих пор я справлялся с этим, имея таймер, который повторно пытается .Open () .., который в конечном итоге завершается успешно (то есть я думаю, что это происходит большую часть времени).

Мой вопрос таков:

Существует ли метод DLLImport, который позволит мне освободить ресурс порта Comm?

1 Ответ

2 голосов
/ 21 сентября 2010

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

Примерно любые две комбинации из этого списка.Да, не работает, вы не можете завершить процесс, если запущен поток ядра, который завершает запрос ввода-вывода, который не может быть завершен.Вы можете сказать из TaskMgr.exe, когда вы используете View + Select Columns и отметьте Handles.Процесс будет зомби с одной открытой ручкой.Не закроется, пока водитель на самом деле не отпустит.Это не произойдет, драйверы USB такие отстойные.

Повторный запуск программы приведет к бомбардировке, а в первом случае процесса все еще открыт порт.Доступ запрещен.

Скажите пользователю, чтобы он держал руки подальше от разъема.Или купить другой от другого производителя.Вы можете помочь, добавив в свою программу пункт «Безопасное извлечение устройства».Это вызывает метод SerialPort.Close ().Позвоните в Sleep (2500) и отобразите окно сообщения о том, что можно отключить его.

...