簡體   English   中英

誰擁有.NET中的包裹流(例如TextWriter)?

[英]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)。 我的問題是這樣的:

  1. 是否將此約定(使用默認構造函數/參數)應用於.NET中的所有流?

    是否有佳能討論這種資源使用模式? 例如,可以假設CryptoStream會關閉MemoryStream嗎? 我知道答案,並且還有其他問題 ,但如果有這樣的話,我希望它在設計指南方面得到解決。

  2. 這種行為記錄在哪里?

    我找不到TextWriter(stream)CryptoStream構造函數中討論的“所有權” - 當然我只是看錯了位置。 (更新:顯然我不能在讀書,由itsme86這 TextWriter的構造文檔中介紹指出。)

  3. 編寫此類代碼的普遍接受的方法是什么?

    也就是說,底層流需要被讀取(在所有操作結束時,並且因此仍然打開),而所有的嵌套流應該被關閉/ 完全沖洗-一個簡單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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM