2012-12-13 19 views
6

È necessario svuotare uno Stream dopo il lavaggio di uno StreamWriter?È necessario il doppio risciacquo?

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? 
} 

risposta

4

Secondo la documentazione MSDN, questo potrebbe essere perdonato come "solo fare in modo" ...

StreamWriter.Flush():

Azzera tutti i buffer per lo scrittore corrente e provoca alcun tamponata dati da scrivere nel flusso sottostante.

Stream.Flush():

Quando override in una classe derivata, elimina tutti i buffer per questo flusso e provoca alcun dato bufferizzato da scrivere al dispositivo sottostante.

... Tuttavia, uno sguardo più da vicino il codice TypeDescriptor mostra che StreamWriter.Flush() (e vorrei assumere la sua controparte asincrono FlushAsync) è un sovraccarico che chiama la funzione primaria, passando due parametri booleani che istruire StreamWriter per svuotare il flusso e l'encoder Unicode. Quindi, una chiamata a StreamWriter.FlushAsync(), abbinata alla parola chiave await per garantire che l'operazione asincrona sia avvenuta completamente, dovrebbe andare bene.

4

Non è necessario, i StreamWriter.Flush e StreamWriter.FlushAsync metodi chiamano il Stream.Flush internamente.