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中没有这个问题所以我可能不得不回到那个......
我需要在发布代码之前简化应用程序 - 但之前有人在调试器中看到过这样的行为吗?
非常感谢!
答案 0 :(得分:1)
也许您的端口被操作系统关闭,因为它没有从您的应用程序获得响应(它在断点处停止)。
答案 1 :(得分:1)
今天早上我遇到了同样的问题。令人惊讶的是,当我在VS2008工具中禁用以下选项时,它已经消失了 - >选项 - >调试 - >一般:
我不知道为什么,但它对我有用。
答案 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()相同。 看起来对我来说这是一个很好的解决方法!