关闭.NET SerialPort后的ObjectDisposedExecption

时间:2011-08-18 20:43:29

标签: c# .net .net-4.0 serial-port objectdisposedexception

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

当我完成设备后,我在SerialPort上调用Close。我不打电话给Dispose,但我相信Close和Dispose在这里是同义词。

通常情况下这很好。

然而,有时候,我会在一段时间后得到以下异常(我看到的时间范围从5毫秒到175毫秒):

System.ObjectDisposedException: Safe handle has been closed
     at System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success)
     at System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle, Boolean& success)
     at Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(SafeFileHandle hFile, NativeOverlapped* lpOverlapped, Int32& lpNumberOfBytesTransferred, Boolean bWait)
     at System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent()
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
     at System.Threading.ThreadHelper.ThreadStart()

我的代码都不在此堆栈中。

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

  1. 始终调用Close(),然后调用Dispose()。
  2. 永远不要重复使用SerialPort对象,在需要重新打开端口时始终创建一个新对象。
  3. 我知道,他们没有太多新闻,但它一直在为我工作。

答案 1 :(得分:0)

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