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
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).
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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