在调试.NET winform时,SerialPort导致ObjectDisposedException的原因是什么?

时间:2008-11-14 16:10:40

标签: winforms visual-studio-2008 .net-3.5 serial-port dispose

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

我有一个我正在玩的winforms应用程序,它使用SerialPort对象作为私有变量。编译和执行应用程序时,它运行良好。它也可以在没有任何断点的调试模式下运行。 90%的情况下,当我停在断点处并尝试单步执行代码时,我会得到一个“未处理的异常”对话框,其中包含以下详细信息:

System.ObjectDisposedException未处理   消息=“安全句柄已关闭”   来源= “mscorlib程序”   对象名=“”   堆栈跟踪:        在Microsoft.Win32.Win32Native.SetEvent(SafeWaitHandle句柄)        在System.Threading.EventWaitHandle.Set()        在System.IO.Ports.SerialStream.AsyncFSCallback(UInt32 errorCode,UInt32 numBytes,NativeOverlapped * pOverlapped)        在System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode,UInt32 numBytes,NativeOverlapped * pOVERLAP)   的InnerException:

令人沮丧的是,我不必踩过与序列相关的代码!我只需要用端口完成某些东西。所以我可能会读一个字符串,操纵字符串,将两个数字加在一起,然后是BANG。

同样,在没有调试时,或者在没有任何断点的情况下进行调试时,这种方法都可以正常工作。似乎有一些关于在断点处停止使得CLR将SerialStream置于不同线程上的东西。

网上有很多关于使用USB设备导致此问题的问题。但我正在使用COM1上的内置主板端口。

我认为我在.NET 2.0中没有这个问题所以我可能不得不回到那个......

我需要在发布代码之前简化应用程序 - 但之前有人在调试器中看到过这样的行为吗?

非常感谢!

5 个答案:

答案 0 :(得分:1)

也许您的端口被操作系统关闭,因为它没有从您的应用程序获得响应(它在断点处停止)。

答案 1 :(得分:1)

今天早上我遇到了同样的问题。令人惊讶的是,当我在VS2008工具中禁用以下选项时,它已经消失了 - >选项 - >调试 - >一般:

  • “启用例外助理”
  • “启用.NET Framework源代码”
  • “跨越属性和运营商”
  • “启用属性评估和其他隐式函数调用”

我不知道为什么,但它对我有用。

答案 2 :(得分:0)

嗯,我不太确定这是一个答案,但肯定有关于那个项目的事情。它最初是用2.0编写的,并由VS2008转换为3.5。我在C#-Express 2008中创建了一个新项目,逐个添加原始类,现在它就像一个魅力!不知道有什么不同。

答案 3 :(得分:0)

我也有这个。这必须是调试器的某种错误。上述建议有效:禁用“启用属性评估和其他隐式函数调用”。

我有一个具有执行串行I / O的属性的类。我想也许调试器在我将鼠标悬停在它上面时有助于显示属性值,从而从调试器线程执行IO。但事实似乎并非如此。我真的不确定原因是什么。

答案 4 :(得分:0)

我遇到了同样的问题并做了以下事情:

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

和我的Read()相同。 看起来对我来说这是一个很好的解决方法!