Ho un metodo che riceve un flusso per scrivere su di esso utilizzando un BinaryWriter. Ma quando dispongo questo BinaryWriter, chiude anche il flusso. Posso lasciarlo non esposto così posso lasciare il mio stream aperto?Perché un BinaryWriter chiude il flusso esterno a disposizione e come prevenirlo? (.NET C#)
risposta
Basta non chiamare Dispose, usare Flush invece, è sicuro.
Nel caso di BinaryWriter
, questa non è un'opzione diretta (anche se alcuni wrapper di flusso consentono di controllare questo, ad esempio GZipStream
ecc.).
Jon ha un NonClosingStreamWrapper in MiscUtil che dovrebbe funzionare: si avvolge lo stream nel wrapper non di chiusura e si consegna il wrapper a BinaryWriter
. Questo essenzialmente passa attraverso tutto eccetto Close()
e Dispose()
.
grande biblioteca, bel lavoro! –
Link non funzionante: http://www.yoda.arachsys.com/csharp/miscutil/ – colithium
Non pensi che ci sia un po 'di trucco? Suggerisci di modificare il comportamento (e le ipotesi) di BinnaryWriter ingannandolo con il wrapper? –
Il metodo protetto BinaryWriter.Dispose (bool) è virtuale e tutto ciò che fa è chiudere lo stream (è possibile verificare che sia vero in Reflector). -Questo metodo è chiamato dal metodo Dispose().
È possibile ereditare semplicemente una classe da BinaryWriter e sovrascrivere il metodo Dispose (bool) per non eseguire nulla o qualcos'altro.
A partire da .NET 4.5, la classe BinaryWriter ha un nuovo costruttore che accetta un parametro booleano per indicare se lasciare aperto il flusso o meno.
Rif: http://msdn.microsoft.com/en-us/library/gg712841.aspx
public BinaryWriter(
Stream output,
Encoding encoding,
bool leaveOpen
)
Felice di aver fornito queste informazioni più recenti. Grazie! –
Sì, l'ho controllato su Reflector ed è vero. –
È sicuro _oggi ._. Utilizzerai Reflector su ever release di .NET per assicurarti che continui a essere sicuro? Questa non è una soluzione. -1. –
Sarà sempre al sicuro. Solo a causa della semantica dello scrittore. Pensa al motivo per cui è stato eliminato per ora (suggerisci gli esempi su msdn). Si noti inoltre che questo non è l'unico posto in .NET che usa in modo errato IDisposable, ad esempio conosco bene il problema di Dispose con i canali WCF. –