关闭.NET SerialPort后的ObjectDisposedExecption

我使用.NET 4 SerialPort对象与连接到COM1的设备进行通信。

当我完成设备后,我在SerialPort上调用Close。 我没有调用Dispose,但我相信Close和Dispose在这里是同义词。

通常这很好用。

但是,有时我会在一段时间后得到以下exception(我看过的时间范围从5毫秒到175毫秒):

  System.ObjectDisposedException:已关闭安全句柄
     在System.Runtime.InteropServices.SafeHandle.DangerousAddRef(布尔和成功)
     在System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle,布尔和成功)
     在Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(SafeFileHandle hFile,NativeOverlapped * lpOverlapped,Int32&lpNumberOfBytesTransferred,Boolean bWait)
     在System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent()
     在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
     在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态,布尔ignoreSyncCtx)
     在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)
     在System.Threading.ThreadHelper.ThreadStart() 

我的代码都没有在这个堆栈上。

我找到了http://blog.zachsaw.com/2010/07/serialport-ioexception-workaround-in-c.html ,但那里的解决方案没有用。 在进一步检查时,问题是IOException ,而不是ObjectDisposedException

关于拔掉USB到串口设备但是COM1在机上时观察到的问题,有很多post,所以它并没有意外消失。

这里的问题也不是我的问题; SerialPort在其使用期间保持活动状态,并且仅在我与设备通话时才关闭。 (一旦我完成,设备处于不会传输任何其他数据的状态。)

SLaks 建议在SafeHandle.Dispose的入口处设置一个断点,以确定我何时处理我不应该的东西,但是我会破坏该断点数十次。 当我使用串行设备时,我单次调用SerialPort.Close调用了三次,其余大约一半都在GC线程中。 其余部分似乎与WPF UI元素相关。

我现在不知所措。 我从哪里去?

有没有办法确定哪个SafeHandle属于哪个对象,所以我可以肯定我没有意外地处理它?
除了Close之外还有一些咒语我需要正确关闭SerialPort吗?

我也有这个问题,因为我开始使用以下两条规则,我再也没见过。

  1. 始终调用Close(),然后调用Dispose()。
  2. 永远不要重用SerialPort对象,在需要重新打开端口时始终创建一个新对象。

我知道,他们没有太多新闻,但它一直在为我工作。

对被处置的调用是记录在案的行为( 见这里 ) – 我猜你在关闭后尝试读/写(可能在另一个线程中)。 我建议在一个单独的类中包装调用并设置一个“关闭”标志。 那么你应该能够很快找到问题。