ObjectDisposedExecption después de cerrar un .NET SerialPort

Estoy usando un objeto .NET 4 SerialPort para hablar con un dispositivo conectado a COM1.

Cuando termine con el dispositivo, llamo a Cerrar en el SerialPort. No llamo a Dispose, pero creo que Close y Dispose son sinónimos aquí.

Por lo general, esto funciona bien.

A veces, sin embargo, obtengo la siguiente excepción algún tiempo después (los tiempos que he visto varían de 5 ms a 175 ms):

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()

Ninguno de mi código está en esta pila.

Encontréhttp: //blog.zachsaw.com/2010/07/serialport-ioexception-workaround-in-c.htm, pero la solución allí no funcionó. En una inspección adicional, el problema es unIOException, no unObjectDisposedException.

Hay una gran cantidad de publicaciones relacionadas con problemas observados cuando un dispositivo USB a serie está desconectado, pero COM1 está integrado, por lo que no desaparece inesperadamente.

El problemaaqu tampoco es mi problema; SerialPort se mantiene con vida mientras dura su uso, y se cierra solo cuando termino de hablar con el dispositivo. (Una vez que haya terminado, el dispositivo se encuentra en un estado en el que no transmitirá más datos).

SLaks sugiere establecer un punto de interrupción en la entrada deSafeHandle.Dispose, para determinar cuándo estoy desechando algo que no debería ser, pero llego a ese punto de quiebre docenas de veces. Tres veces son llamadas por mi única llamada aSerialPort.Close, cuando termine de usar el dispositivo en serie, y aproximadamente la mitad del resto está en el hilo del GC. El resto parece estar relacionado con los elementos de la interfaz de usuario de WPF.

Ahora estoy perdido. ¿A donde voy desde aqui

¿Hay alguna forma de determinar qué SafeHandle pertenece a qué objeto, por lo que puedo estar seguro de que no lo eliminaré inesperadamente?
¿Hay algún encantamiento que no sea Cerrar? Necesito cerrar correctamente un SerialPort?

Respuestas a la pregunta(2)

Su respuesta a la pregunta