ObjectDisposedException nach dem Schließen eines .NET SerialPorts

9

Ich verwende ein .NET 4 SerialPort-Objekt, um mit einem an COM1 angeschlossenen Gerät zu kommunizieren.

Wenn ich mit dem Gerät fertig bin, rufe ich Close auf dem SerialPort an. Ich rufe Dispose nicht an, aber ich glaube, dass Close und Dispose auch hier sind.

Normalerweise funktioniert das gut.

Manchmal bekomme ich jedoch einige Zeit später die folgende Ausnahme (Die Zeiten, die ich gesehen habe, reichen von 5 ms bis 175 ms):

%Vor%

Keiner meiner Code ist auf diesem Stapel.

Ich habe Ссылка gefunden, aber die Lösung dort hat nicht funktioniert . Bei weiterer Überprüfung ist das Problem ein IOException , nicht ein ObjectDisposedException .

Es gibt eine Unmenge von Posts bezüglich Problemen, die beobachtet werden, wenn ein USB-Seriell-Gerät ausgesteckt wird, aber COM1 ist an Bord, so dass es nicht unerwartet verschwindet.

Das Problem hier ist auch nicht mein Problem; Der SerialPort wird für die Dauer seiner Verwendung am Leben erhalten und wird nur geschlossen, wenn ich mit dem Gerät gesprochen habe. (Sobald ich fertig bin, ist das Gerät in einem Zustand, in dem es keine weiteren Daten übertragen wird.)

SLaks schlägt vor, einen Haltepunkt am Eingang von% co_de festzulegen %, um festzustellen, wann ich etwas entsorge, was ich nicht sein sollte, aber ich treffe diesen Haltepunkt dutzende Male. Drei Mal werden von meinem einzigen Aufruf an SafeHandle.Dispose aufgerufen, wenn ich das serielle Gerät fertig habe, und ungefähr die Hälfte des Rests sind im GC-Thread. Der Rest scheint mit WPF UI-Elementen in Verbindung zu stehen.

Ich bin jetzt ratlos. Wohin gehe ich von hier?

Gibt es eine Möglichkeit zu bestimmen, welches SafeHandle zu welchem ​​Objekt gehört, damit ich sicher sein kann, dass ich es nicht unerwartet entsorgere? Gibt es eine andere Beschwörungsformel als Schließen? Ich muss einen SerialPort ordnungsgemäß herunterfahren?

    
DaleStan 18.08.2011, 20:43
quelle

2 Antworten

3

Ich hatte dieses Problem auch, und seit ich die folgenden zwei Regeln benutze, habe ich es nie wieder gesehen.

  1. Rufen Sie immer Close () auf, gefolgt von Dispose ().
  2. Verwenden Sie niemals ein SerialPort-Objekt, sondern erstellen Sie immer ein neues, wenn ein Port erneut geöffnet werden muss.

Ich weiß, sie sind nicht viel Neues, aber es hat für mich funktioniert.

    
Per 18.08.2011, 21:33
quelle
0

Der Aufruf von disposed ist dokumentiertes Verhalten ( siehe hier >) - Ich schätze, du versuchst nach Close zu lesen / schreiben (vielleicht in einem anderen Thread). Ich würde vorschlagen, die Anrufe in eine separate Klasse zu verpacken und ein "geschlossen" -Flag zu setzen. Dann sollten Sie in der Lage sein, das Problem ziemlich schnell zu finden.

    
Carsten 18.08.2011 20:49
quelle