Что вызывает исключение ObjectDisposedException из SerialPort при отладке .NET winform? - PullRequest
0 голосов
/ 14 ноября 2008

Vista SP1 Visual Studio 2008 SP1 .NET 3.5 SP1 C #

У меня есть приложение winforms, с которым я играю и которое использует объект SerialPort в качестве закрытой переменной. Когда приложение компилируется и выполняется, оно прекрасно работает. Он также работает в режиме отладки без каких-либо точек останова. 90% времени, когда я останавливаюсь на точке останова и пытаюсь пройти по коду, я получаю диалоговое окно «Произошло необработанное исключение» со следующими деталями:

System.ObjectDisposedException не обработан Сообщение = "Безопасный дескриптор закрыт" Источник = "mscorlib" ObjectName = "" Трассировки стека: в Microsoft.Win32.Win32Native.SetEvent (дескриптор SafeWaitHandle) в System.Threading.EventWaitHandle.Set () в System.IO.Ports.SerialStream.AsyncFSCallback (код ошибки UInt32, numBytes UInt32, NativeOverlapped * pOverlapped) в System.Threading._IOCompletionCallback.PerformIOCompletionCallback (код ошибки UInt32, numBytes UInt32, NativeOverlapped * pOVERLAP) InnerException:

Разочарование в том, что мне не нужно перешагивать через последовательный код! Я просто должен был сделать что-то с портом. Таким образом, я мог бы прочитать строку, манипулировать строкой, добавить два числа вместе, что угодно, а затем BANG.

Опять же, это прекрасно работает, когда НЕ выполняется отладка или отладка без каких-либо точек останова. Похоже, что при остановке в точке останова что-то заставляет CLR утилизировать SerialStream в другом потоке.

В Интернете много болтовни о проблемах, связанных с обновлением USB-устройств, вызывающих это. Но я использую порт встроенной материнской платы на COM1.

Я не думаю, что у меня была эта проблема в .NET 2.0, поэтому мне, возможно, придется вернуться к этому ...

Мне нужно немного упростить приложение, прежде чем я смогу публиковать код - но кто-нибудь видел такое поведение в отладчике раньше?

Большое спасибо!

Ответы [ 5 ]

1 голос
/ 19 ноября 2008

У меня была такая же проблема только этим утром. Удивительно, но это просто исчезло, когда я ОТКЛЮЧИЛ следующие опции в VS2008 Tools-> Options-> Debugging-> General:

  • «Включить помощника по исключениям»
  • «Включить пошаговое изменение исходного кода .NET Framework»
  • "Переступи через свойства и операторы"
  • «Включить оценку свойства и другие неявные вызовы функций»

Понятия не имею почему, но у меня это сработало.

1 голос
/ 16 ноября 2008

Возможно, ваш порт закрывается ОС, так как он не получает ответ от вашего приложения (он остановлен в точке останова).

0 голосов
/ 19 мая 2017

У меня была такая же проблема, и я сделал следующее:

serialPortLock = Monitor.TryEnter(serialPort, 3000);
Thread.Sleep(5);
serialPort.Write(msg, 0, msg.Length);

и то же самое для моего Чтения (). Похоже, это хороший обходной путь для меня!

0 голосов
/ 16 декабря 2008

У меня тоже есть. Это должно быть какая-то ошибка с отладчиком. Вышеприведенный совет сработал: отключите «Включить оценку свойства и другие неявные вызовы функций».

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

0 голосов
/ 19 ноября 2008

Ну, я не уверен, что это ответ, но определенно было что-то в этом проекте. Первоначально он был написан в 2.0 и преобразован в 3.5 по VS2008. Я создал новый проект в C # -Express 2008, добавив оригинальные классы один за другим, и теперь он работает как шарм! Понятия не имею, что отличается.

...