Laden...

SerialPort erneut öffnen nach Close() -> Problematisch wegen Dispose() oder nicht

Erstellt von ill_son vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.679 Views
I
ill_son Themenstarter:in
227 Beiträge seit 2009
vor 7 Jahren
SerialPort erneut öffnen nach Close() -> Problematisch wegen Dispose() oder nicht

Hallo,

wie die Überschrift schon sagt, habe ich in meiner Anwendung einen SerialPort, den ich hin und wieder schließen und wieder öffnen muss. Nun sagt die mdsn, dass Close() Dispose(true) aufruft. Kann es also passieren, dass


SerialPort sp = new SerialPort("COMx");

sp.Open();
sp.Close();

//beliebige Zeit warten

sp.Open();


eine ObjectDisposedException auslöst und ist es somit besser, nach Close() den Port neu zu instanziieren? Ich habe ein ähnliches Beispiel mal versucht, aber keine Exception erhalten, was ja aber nicht heißt, dass es immer klappen muss.

Grüße, Alex

Final no hay nada más

16.834 Beiträge seit 2008
vor 7 Jahren

Im Quellcode vom SerialPort seh ich bei Open keine Stelle, die eine ObjectDisposed Exception auslöst.
http://referencesource.microsoft.com/#System/sys/system/io/ports/SerialPort.cs

Sicher, dass das vom SerialPort kommt?
Nichst desto trotz: verwirft man etwas, ist es üblich, dass man es neu initialisiert.
Dispose sollte bei korrekter Implementierung, wie Microsoft es vorschlägt, den GC callen.

SerialPort erbt von Component und dort ist das auch so hinterlegt:

       /// <devdoc>
        ///    <para>
        ///       Disposes of the <see cref='System.ComponentModel.Component'/>
        ///       .
        ///    </para>
        /// </devdoc>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed")]
        public void Dispose() {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

Dispose heisst ja nicht umsonst Dispose (=> entsorgen).

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo,

hättest Du ausser der Doku für Close auch mal in die für Open geschaut,hättest Du unter Remarks folgendes gefunden:

Only one open connection can exist per SerialPort object.

The best practice for any application is to wait for some amount of time after calling the Close method before attempting to call the Open method, as the port may not be closed instantly.

Das würde ich zumindest so interpretieren, dass Du die Instanz mehrfach verbbinden und trennen kannst.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

I
ill_son Themenstarter:in
227 Beiträge seit 2009
vor 7 Jahren

Den Satz habe ich gelesen. Denn kann man aber auch so interpretieren - und so habe ich ihn interpretiert - dass man auf den COM-Port mit Name "COMx" erst wieder nach einer gewissen Zeit nachdem er geschlossen wurde zugreifen darf, mit einer anderen Anwendung oder Instanz oder was auch immer. Der Close-Vorgang dauert sozusagen ein bisschen.

Final no hay nada más