Wysyłam strumień do metod do pisania, aw tych metodach używam binarnego czytnika / wrtier. Kiedy czytelnik / piszący zostanie usunięty, przez using
lub tylko wtedy, gdy nie ma do niego odniesienia, czy strumień również jest zamknięty?
Chciałbym wysłać BinaryReader / Writer, ale używam też StreamReader (może powinienem to obejść. Używam tego tylko dla GetLine i ReadLine). Jest to dość kłopotliwe, jeśli zamyka strumień za każdym razem, gdy zostaje zamknięty autor / czytelnik.
źródło
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.
czy należy to po prostu zignorować? Jak dotąd nie miałem żadnych wyjątków ...StreamReader
. Ostrzeżenie wygląda na fałszywe, biorąc pod uwagę, że dokumentacjaIDisposable.Dispose
jawnie stwierdza: "Jeśli metoda Dispose obiektu jest wywoływana więcej niż raz, obiekt musi ignorować wszystkie wywołania po pierwszym. Obiekt nie może zgłaszać wyjątku, jeśli jego metoda Dispose to dzwoniono wiele razy. ”To jest stara, ale chciałem zrobić dziś coś podobnego i stwierdziłem, że wszystko się zmieniło. Od .net 4.5 istnieje
leaveOpen
argument:Jedynym problemem jest to, że nie jest do końca oczywiste, co ustawić dla innych parametrów. Oto pomoc:
Ze strony msdn dla StreamReader Constructor (Stream):
Że właśnie liście
detectEncodingFromByteOrderMarks
, który sądząc przez kod źródłowy jesttrue
Byłoby miło, gdyby niektóre z tych wartości domyślnych zostały ujawnione lub gdyby argumenty były opcjonalne, abyśmy mogli po prostu określić te, które chcemy.
źródło
using (var streamReader = new StreamReader(myStream, Encoding.UTF8, true, 1024, true))
Tak. Możesz to sprawdzić, patrząc na implementację za pomocą Reflectora.
źródło
Sześć lat później, ale może to komuś pomoże.
StreamReader zamyka połączenie po jego usunięciu. Jednak „using (Stream stream = ...) {...}” with StreamReader / StreamWriter może spowodować dwukrotne usunięcie Stream: (1) po usunięciu obiektu StreamReader (2) i gdy Stream using block zamyka się. Powoduje to ostrzeżenie CA2202 podczas uruchamiania analizy kodu VS.
Innym rozwiązaniem, zaczerpniętym bezpośrednio ze strony CA2202 , jest użycie bloku try / last . Skonfiguruj poprawnie, spowoduje to tylko jednokrotne zamknięcie połączenia.
W dolnej części CA2202 firma Microsoft zaleca użycie następujących elementów:
zamiast...
źródło
Tak. Wywołanie Dispose () on i IDisposable (co „użycie” robi) powinno spowodować, że obiekt wyczyści wszystkie swoje zasoby. Obejmuje to opróżnianie strumieni i zamykanie ich deskryptorów plików.
Jeśli w twoim przypadku chcesz przekazać to innym metodom, musisz upewnić się, że te metody nie wykonują odczytu / zapisu w bloku using.
źródło
W razie potrzeby prostym sposobem rozwiązania tego problemu jest zastąpienie metody Dispose klas StreamWriter. Zobacz mój post tutaj, aby uzyskać kod, jak to zrobić:
Czy .Disposing a StreamWriter zamyka źródłowy strumień?
źródło
strumień jest usuwany za pomocą słowa kluczowego „using” lub jawnie wywołując dispose
źródło