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

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

system.ObjectDisposedException是未经用来的消息=“安全句柄已关闭已关闭” source =“ mscorlib” objectName =“” stacktrace:at Microsoft.Win32.Win32Native.SetEvent(SafeWaitHandle handle) at System.Threading.EventWaitHandle.Set() at System.IO.Ports.SerialStream.AsyncFSCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOverlapped) at System.Threading._IOCompletionCallback. PerformiococteyCallback(UINT32错误代码,UINT32 NUMBYTES,本机填充*贫困)Innerexception:

令人沮丧的是,我不必单步执行与串行相关的代码!我只需要完成 某物 与端口。所以我可能会读取一个字符串,操作该字符串,将两个数字加在一起,等等,然后“砰”。

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

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

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

在发布代码之前,我需要相当多地简化应用程序 - 但是以前有人在调试器中见过这样的行为吗?

非常感谢!

有帮助吗?

解决方案

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

  • “启用异常助手”
  • “启用 .NET Framework 源代码单步调试”
  • “超越属性和运营商”
  • “启用属性评估和其他隐式函数调用”

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

其他提示

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top