[英]Who owns wrapped streams (e.g. TextWriter) in .NET?
我最近遇到一個錯誤“ObjectDisposedException:無法訪問已關閉的流”
[ObjectDisposedException: Cannot access a closed Stream.]
System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count) +10184402
System.Security.Cryptography.CryptoStream.FlushFinalBlock() +114
System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) +48
使用以下格式的代碼時:
using (var stream = new MemoryStream())
{
using (var hashStream = new CryptoStream(stream,
new SHA256Managed(), CryptoStreamMode.Write))
using (var writer = new TextWriter(hashStream))
{
writer.Write("something");
}
// ^-- Exception occurs on hashStream Dispose
// While naively I assumed that TextWriter.Dispose wouldn't touch the
// underlying stream(s).
return stream.ToArray();
}
因此引發異常是因為TextWriter的Dispose釋放了包裝的Stream(hashStream)。 我的問題是這樣的:
是否將此約定(使用默認構造函數/參數)應用於.NET中的所有流?
是否有佳能討論這種資源使用模式? 例如,可以假設CryptoStream會關閉MemoryStream嗎? 我知道答案,並且還有其他問題 ,但如果有這樣的話,我希望它在設計指南方面得到解決。
這種行為記錄在哪里?
我找不到TextWriter(stream)
或CryptoStream
構造函數中討論的“所有權” - 當然我只是看錯了位置。 (更新:顯然我不能在讀書,由itsme86這是 TextWriter的構造文檔中介紹指出。)
編寫此類代碼的普遍接受的方法是什么?
也就是說,底層流需要被讀取(在所有操作結束時,並且因此仍然打開),而所有的嵌套流應該被關閉/ 完全沖洗-一個簡單CryptoStream.Flush是不夠的,例如。
StreamWriter()文檔中特別提到了這一點。
調用StreamWriter.Dispose時,StreamWriter對象在提供的Stream對象上調用Dispose()。
在閱讀using
語句C#spec並查看一些實現的流(內存,文件等)之后,我看到默認行為是在調用Dispose()
時處理底層流。 在某些流中,您可以明確聲明您不想處理底層流,就像在DeflateStream
:
public DeflateStream(Stream stream, CompressionLevel compressionLevel, bool leaveOpen)
leaveOpen類型:System.Boolean如果在處理DeflateStream對象后保持流對象處於打開狀態,則為true; 否則,錯誤。
當然,您可以通過不使用using語句來處理處理,或者實現一個WrapperStream
類來封裝您的流並且不會處理底層流。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.