gpt4 book ai didi

c# - 谁拥有 .NET 中的包装流(例如 TextWriter)?

转载 作者:太空狗 更新时间:2023-10-29 17:50:41 25 4
gpt4 key购买 nike

我最近遇到错误“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?我知道答案,还有are other questions specifically about this ,但如果有这样的设计指南,我希望它能得到解决。

  2. 此类行为记录在何处?

    我找不到 TextWriter(stream) 中讨论的“所有权”或 CryptoStream构造函数 - 当然我只是看错了位置。 (更新:显然我无法阅读,正如 itsme86 指出的那样, 记录在 TextWriter 构造函数文档中。)

  3. 编写此类代码的通用方法是什么?

    也就是说,底层流需要被读取(在所有操作结束时,因此仍然打开),而所有嵌套流都应该被关闭/刷新完全 - 一个简单的CryptoStream.Flush例如,这是不够的。

最佳答案

这在the StreamWriter() documentation中特别提到.

The StreamWriter object calls Dispose() on the provided Stream object when StreamWriter.Dispose is called.

关于c# - 谁拥有 .NET 中的包装流(例如 TextWriter)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23162988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com