Ich sende einen Stream an Methoden zum Schreiben und verwende bei diesen Methoden einen binären Reader / Wrtier. Wenn der Leser / Schreiber entweder von using
oder nur wenn nicht darauf verwiesen wird, wird der Stream ebenfalls geschlossen?
Ich würde einen BinaryReader / Writer senden, aber ich verwende auch einen StreamReader (vielleicht sollte ich das umgehen. Ich verwende das nur für GetLine und ReadLine). Dies ist ziemlich problematisch, wenn der Stream jedes Mal geschlossen wird, wenn ein Schreiber / Leser geschlossen wird.
quelle
CA2202 : Microsoft.Usage : Object 'stream' can be disposed more than once in method '...'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.
Sollte das einfach ignoriert werden? Ich habe bisher keine Ausnahmen bekommen ...StreamReader
. Die Warnung erscheint mir falsch, da in den DokumentenIDisposable.Dispose
explizit angegeben wird: "Wenn die Dispose-Methode eines Objekts mehrmals aufgerufen wird, muss das Objekt alle Aufrufe nach dem ersten ignorieren. Das Objekt darf keine Ausnahme auslösen, wenn die Dispose-Methode lautet." mehrfach angerufen. "Dies ist eine alte, aber ich wollte heute etwas Ähnliches tun und stellte fest, dass sich die Dinge geändert haben. Seit .net 4.5 gibt es ein
leaveOpen
Argument:Das einzige Problem ist, dass es nicht ganz offensichtlich ist, was für die anderen Parameter eingestellt werden soll. Hier ist eine Hilfe:
Von der msdn-Seite für StreamReader Constructor (Stream):
Damit bleibt nur,
detectEncodingFromByteOrderMarks
was nach dem Quellcode zu urteilen isttrue
Es wäre schön, wenn einige dieser Standardeinstellungen verfügbar wären oder wenn die Argumente optional wären, damit wir nur die gewünschten angeben könnten.
quelle
using (var streamReader = new StreamReader(myStream, Encoding.UTF8, true, 1024, true))
Ja tut es. Sie können dies überprüfen, indem Sie sich die Implementierung mit Reflector ansehen.
quelle
Sechs Jahre zu spät, aber vielleicht hilft das jemandem.
StreamReader schließt die Verbindung, wenn sie entsorgt wird. "Using (Stream stream = ...) {...}" mit StreamReader / StreamWriter kann jedoch dazu führen, dass der Stream zweimal entsorgt wird: (1) wenn das StreamReader-Objekt entsorgt wird (2) und wenn der Stream using block ist schließt. Dies führt zu einer CA2202-Warnung, wenn die Code-Analyse von VS ausgeführt wird.
Eine andere Lösung, die direkt von der CA2202- Seite übernommen wurde, ist die Verwendung eines try / finally-Blocks. Bei korrekter Einrichtung wird die Verbindung nur einmal geschlossen.
Microsoft empfiehlt, im unteren Bereich von CA2202 Folgendes zu verwenden:
anstatt...
quelle
Ja. Durch Aufrufen von Dispose () on und IDisposable (was "using" bewirkt) sollte ein Objekt alle seine Ressourcen bereinigen. Dies umfasst das Leeren und Schließen der Dateideskriptoren durch Streams.
Wenn Sie es in Ihrem Fall an andere Methoden übergeben möchten, müssen Sie sicherstellen, dass diese Methoden nicht in einem using-Block lesen / schreiben.
quelle
Eine einfache Möglichkeit, dies zu beheben, besteht darin, die Dispose-Methode der StreamWriter-Klassen zu überschreiben. In meinem Beitrag hier finden Sie den Code dazu:
Schließt .Disposing a StreamWriter den zugrunde liegenden Stream?
quelle
Der Stream wird entweder durch Verwenden des Schlüsselworts "using" oder durch expliziten Aufruf von dispose entsorgt
quelle