1 回答
TA贡献1772条经验 获得超5个赞
出于某种未知原因,如果我转储对象,我会看到 MemoryStream 仍在 Main 方法的末尾。
这并不是特别不正常;GC 单独发生。
这导致我大量泄漏。
这不是泄漏,这只是内存使用情况。
知道如何清理这个缓冲区吗?
我可能只是不使用MemoryStream,而是返回包装实时解压缩流(来自s = data.Open())的东西。但是,这里的问题是您不能直接返回s——因为archive在离开方法时仍然会被处理。因此,如果我需要解决这个问题,我将创建一个Stream包装内部流的自定义,并在处理时处理第二个对象,即
class MyStream : Stream {
private readonly Stream _source;
private readonly IDisposable _parent;
public MyStream(Stream, IDisposable) {...assign...}
// not shown: Implement all Stream methods via `_source` proxy
public override void Dispose()
{
_source.Dispose();
_parent.Dispose();
}
}
然后有:
public static Stream GetDb()
{
var filepath = Path.Combine("c:/users/tom/Downloads", "productdb.zip");
var archive = ZipFile.OpenRead(filepath);
var data = archive.Entries.Single(e => e.FullName == "productdb.json");
var s = data.Open();
return new MyStream(s, archive);
}
(可以稍微改进以确保archive在我们成功返回之前发生异常时已处理)
- 1 回答
- 0 关注
- 166 浏览
添加回答
举报