none
SerialPort und Hotplugging RRS feed

  • Frage

  • Hallo!

    Ich verwende die System.IO.Ports.SerialPort Klasse, um über einen USB/RS232 Adapter mit einem Messgerät zu kommunizieren. Das funktioniert soweit ganz gut, aber gleich zum Problem:

    Wenn der USB/RS232 Adapter entfernt wird, treten in den Methoden zum Empfangen und Senden Exceptions auf, wie es auch zu erwarten ist. Allerdings tritt in der Dispose() Methode auch eine Exception auf:

    System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled exception</Description><AppDomain>FESA_VCS.vshost.exe</AppDomain><Exception><ExceptionType>System.UnauthorizedAccessException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Access to the port is denied.</Message><StackTrace>   at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
       at System.IO.Ports.InternalResources.WinIOError()
       at System.IO.Ports.SerialStream.Dispose(Boolean disposing)
       at System.IO.Ports.SerialStream.Finalize()</StackTrace><ExceptionString>System.UnauthorizedAccessException: Access to the port is denied.
       at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
       at System.IO.Ports.InternalResources.WinIOError()
       at System.IO.Ports.SerialStream.Dispose(Boolean disposing)
       at System.IO.Ports.SerialStream.Finalize()</ExceptionString></Exception></TraceRecord>

    Bei meinem eigenen Aufruf von Dispose() wäre das nicht so schlimm. Die Exception kann ich abfangen. Allerdings führt die Speicherbereinigung (nach einer Weile) dazu, dass die Methode nochmal aufgerufen wird, was die Applikation sicher zum Absturz bringt.

    Wie kann ich hier vorgehen?

    Ein Abfallhaufen für SerialPort's wäre die letzte Alternative... Da kommen alle Ports drauf, deren Dispose() Methode eine Exception erzeugt, damit die sie nicht mehr bereinigt werden können. Beim Beenden der Applikation schepperts dann allerdings ziemlich, was auch keinen guten Eindruck macht.

    Es müsste doch eine elegantere Möglichkeit geben? USB-Messgeräte verwenden diese Adapter häufig. Kann man ein Objekt irgendwie von der Bereinigung auszunehmen (incl. Programmende)?

    Ich bin für alle Anregungen dankbar :-)

    Hans
    Dienstag, 17. November 2009 18:56

Antworten

Alle Antworten