2012-12-13 5 views
6

Muss eine Stream gespült werden, nachdem eine StreamWriter gespült wurde?Doppelspülung erforderlich?

public static async Task WriteStringAsync(this Stream stream, string messageString) 
{ 
     var encoding = new UTF8Encoding(false); //no BOM 
     using (var streamWriter = new StreamWriter(stream, encoding)) 
     { 
      await streamWriter.WriteAsync(messageString); 
      await streamWriter.FlushAsync(); 
     } 
     await stream.FlushAsync(); //is this necessary? 
} 

Antwort

4

Nach der Dokumentation MSDN, dies als „nur dafür, dass“ vergeben werden konnten ...

StreamWriter.Flush():

Löscht alle Puffer für den aktuellen Schriftsteller und verursacht jede gepufferte Daten, die in den zugrunde liegenden Stream geschrieben werden sollen.

Stream.Flush():

Wenn in einer abgeleiteten Klasse überschreibt, löscht alle Puffer für diesen Strom und bewirkt, daß alle gepufferten Daten an die darunter liegende Gerät geschrieben werden.

... Ein genauerer Blick auf den Code in TypeDescriptor zeigt jedoch, dass StreamWriter.Flush() (und würde seine asynchrone Gegenstück FlushAsync nehmen) ist eine Überlast, die die primäre Funktion aufruft, zwei Booleschen Parameter übergeben die Weisen Sie den StreamWriter an, den Stream und den Unicode-Encoder ebenfalls zu leeren. Daher sollte ein Aufruf von StreamWriter.FlushAsync() zusammen mit dem Schlüsselwort await, um sicherzustellen, dass die asynchrone Operation vollständig stattgefunden hat, in Ordnung sein.

4

Es ist nicht notwendig, die StreamWriter.Flush und StreamWriter.FlushAsync Methoden, um die Stream.Flush intern nennen.