Dal*_*tan 10 .net c# serial-port .net-4.0 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在板载时观察到的问题有很多帖子,所以它并没有意外消失.
这里的问题也不是我的问题; SerialPort在其使用期间保持活动状态,并且仅在我与设备通话时才关闭.(一旦我完成,设备处于不会传输任何其他数据的状态.)
SLaks 建议在入口处设置一个断点SafeHandle.Dispose,以确定我何时处理我不应该做的事情,但是我会破坏该断点数十次.SerialPort.Close当我完成使用串行设备时,我的单次调用会调用三次,其余大约一半都在GC线程中.其余部分似乎与WPF UI元素相关.
我现在不知所措.我从哪里开始?
有没有办法确定哪个SafeHandle属于哪个对象,所以我可以肯定我没有意外地处理它?
除了Close之外还有一些咒语我需要正确关闭SerialPort吗?
我也遇到过这个问题,自从我开始使用以下两条规则以来,我再也没有见过它。
我知道,它们不是什么新闻,但它对我很有用。