0

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

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

System.ObjectDisposedException 未处理 Message="Safe handle has been closed" 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) 在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) InnerException:

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

同样,在不调试时,或者在没有任何断点的情况下调试时,这工作得很好。似乎有一些关于在断点处停止的东西,这使得 CLR 在不同的线程上处理 SerialStream。

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

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

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

非常感谢!

4

5 回答 5

1

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

于 2008-11-16T08:02:35.760 回答
1

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

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

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

于 2008-11-19T15:42:47.173 回答
0

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

于 2008-11-19T12:24:24.453 回答
0

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

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

于 2008-12-15T23:59:52.573 回答
0

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

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

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

于 2017-05-19T12:30:59.883 回答