我最近遇到了一个错误“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)进行了Dispose。我的问题是:
此约定是否适用于 .NET中的所有流(使用默认构造函数/参数) ?
是否有佳能讨论这种资源使用模式?例如,是否可以假设 CryptoStream 会关闭 MemoryStream?我知道答案,并且还有其他专门针对此的问题,但如果有的话,我希望根据设计指南来解决。
这种行为记录在哪里?
我找不到在
TextWriter(stream)
orCryptoStream
构造函数中讨论的“所有权”——当然我只是在看错误的位置。(更新:显然我阅读失败,正如 itsme86所指出的,这记录在 TextWriter 构造函数文档中。)编写此类代码的普遍接受的方法是什么?
也就是说,需要读取底层流(在所有操作结束时,因此仍然打开),而所有嵌套流应该完全关闭/刷新-例如,简单的CryptoStream.Flush是不够的。