调试 .NET winform 时从 SerialPort 引起 ObjectDisposedException 的原因是啥?

Posted

技术标签:

【中文标题】调试 .NET winform 时从 SerialPort 引起 ObjectDisposedException 的原因是啥?【英文标题】:What is causing ObjectDisposedException from SerialPort while debugging .NET winform?调试 .NET winform 时从 SerialPort 引起 ObjectDisposedException 的原因是什么? 【发布时间】:2010-09-22 09:06:21 【问题描述】:

Vista SP1 视觉工作室 2008 SP1 .NET 3.5 SP1 C#

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

System.ObjectDisposedException 未处理 Message="安全句柄已关闭" 来源="mscorlib" 对象名称="" 堆栈跟踪: 在 Microsoft.Win32.Win32Native.SetEvent(SafeWaitHandle 句柄) 在 System.Threading.EventWaitHandle.Set() 在 System.IO.Ports.SerialStream.AsyncFSCallback(UInt32 错误代码,UInt32 numBytes,NativeOverlapped* pOverlapped) 在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 错误代码,UInt32 numBytes,NativeOverlapped* pOVERLAP) 内部异常:

令人沮丧的是,我不必重复与串行相关的代码!我只需要对端口进行一些操作。所以我可能会读取一个字符串,操作该字符串,将两个数字相加,无论如何,然后 BANG。

再一次,这在不调试或在没有任何断点的情况下调试时工作得很好。似乎在断点处停止会导致 CLR 在不同的线程上处理 SerialStream。

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

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

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

非常感谢!

【问题讨论】:

【参考方案1】:

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

【讨论】:

这肯定是正在发生的事情。但我认为这也与我的申请有关。我可以创建一个只有串行端口的 Windows 窗体应用程序,但这不会发生。我正在尝试简化...【参考方案2】:

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

【讨论】:

【参考方案3】:

今天早上我也遇到了同样的问题。令人惊讶的是,当我在 VS2008 Tools->Options->Debugging->General 中禁用以下选项时,它就消失了:

“启用异常助手” “启用 .NET Framework 源代码步进” “跳过属性和运算符” “启用属性评估和其他隐式函数调用”

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

【讨论】:

有趣!我可能不得不在原始项目中摆弄它才能看到!【参考方案4】:

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

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

【讨论】:

【参考方案5】:

我遇到了同样的问题并做了以下操作:

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

我的 Read() 也是如此。 看起来这对我来说是一个很好的解决方法!

【讨论】:

以上是关于调试 .NET winform 时从 SerialPort 引起 ObjectDisposedException 的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

小车PID调试工具Serial_Digital_Scope使用笔记

小车PID调试工具Serial_Digital_Scope使用笔记

小车PID调试工具Serial_Digital_Scope使用笔记

在运行时从另一个 AppDomain 调试动态加载的 DLL

minidump 文件对分析 .NET WinForms 应用程序崩溃有用吗?

Mac下调试Win内核 (双虚拟机调试) 环境配置