ObjectDisposedExecption após fechar um .NET SerialPort

Estou usando um objeto SerialPort .NET 4 para conversar com um dispositivo conectado à COM

Quando terminar o dispositivo, chamo Close no SerialPort. Não chamo Dispose, mas acredito que Close e Dispose são sinônimos aqui.

Normalmente, isso funciona muito be

s vezes, porém, recebo a seguinte exceção algum tempo depois (as vezes que eu vi variam 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()

Nenhum código está nesta pilh

Eu encontreihttp: //blog.zachsaw.com/2010/07/serialport-ioexception-workaround-in-c.htm, mas a solução não funcionou. Em uma inspeção mais aprofundada, o problema é umIOException, não umObjectDisposedException.

Há uma infinidade de postagens relacionadas a problemas observados quando um dispositivo USB-para-serial é desconectado, mas o COM1 está integrado, portanto não desaparece inesperadament

O problemaaqu também não é problema meu; o SerialPort é mantido ativo pelo tempo de uso e é fechado somente quando eu terminar de falar com o dispositivo. (Quando terminar, o dispositivo estará em um estado em que não transmitirá mais dados.)

SLaks sugere definindo um ponto de interrupção na entrada paraSafeHandle.Dispose, para determinar quando estou descartando algo que não deveria estar, mas atinjo esse ponto de interrupção dezenas de vezes. Três vezes são chamados pela minha única chamada paraSerialPort.Close, quando terminar de usar o dispositivo serial, e cerca da metade do restante estiver no encadeamento do GC. O restante parece estar relacionado aos elementos de interface do usuário do WP

Agora estou perdida. Para onde eu vou daqui

Existe uma maneira de determinar qual SafeHandle pertence a qual objeto, para ter certeza de que não o estou descartando inesperadament
Existe algum encantamento que não seja Fechar, preciso desligar corretamente um SerialPort?

questionAnswers(2)

yourAnswerToTheQuestion