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?