English 中文(简体)
在调试.NET winform时,是什么原因导致了SerialPort的ObjectDisposedException?
原标题:
  • 时间:2008-11-14 16:10:40
  •  标签:

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

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

System.ObjectDisposedException was unhandled 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) at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) InnerException:

令人沮丧的是,我不需要在涉及串口的代码中操作!我只需要对端口进行过某些操作。所以我可能会读取一个字符串,操作字符串,将两个数字相加,然后嘭。

再次说明,当未进行调试或者调试时没有任何断点时,这个工作是可以正常进行的。但是,似乎当在断点处停止时,CLR会在另一个线程上释放SerialStream。

网上有很多有关移除USB设备引起这个问题的讨论。但是我正在使用内置的COM1主板端口。

我觉得在.NET 2.0中我没有这个问题,所以我可能要回去用那个版本...

在我贴出代码之前,我需要将应用程序简化一些,但是任何人在调试器中见过这样的行为吗?

非常感谢!

最佳回答

我今天早上也遇到了同样的问题。令人惊讶的是,当我在VS2008的工具菜单下选择“选项”->“调试”->“常规”并禁用以下选项时,问题就自动解决了:

  • "Enable the exception assistant"
  • "Enable .NET Framework source stepping"
  • "Step over properties and operators"
  • "Enable property evaluation and other implicit function calls"

我不知道為什麼,但對我起作用了。

问题回答

也许是因为操作系统没有从您的应用程序中收到响应(它被停在一个断点处),所以您的端口正在关闭。

嗯,我不是很确定这是个答案,但那个项目肯定有些问题。它最初是用2.0版本写的,然后由VS2008转换成了3.5版本。我用C#-Express 2008创建了一个新项目,逐个添加了原有的类,现在它可以完美工作了!不知道有何不同。

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

我有一个类,其中包含进行串行I/O的属性。我认为可能是调试器在我的鼠标悬停在属性上时试图显示属性值,并从调试器线程中执行I/O操作。但似乎不是这种情况。我真的不确定问题的原因是什么。

我遇到了同样的问题,并采取了以下措施:

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

and the same for my Read(). Looks like it s a good workaround for me!





相关问题
热门标签