繁体   English   中英

如何释放 C# 中的 MemoryStream?

[英]How can I free up MemoryStream in C#?

我对 C# 有点陌生。 我已经尝试在管理 memory 方面做正确的事情,但我现在遇到了“内存不足”错误。

更新 #2 12 月 5 日

我解决了它,(有点)我不明白为什么,但是当我使用硬编码参数从我的测试应用程序运行代码时,它工作得很好,但是当我使用对话框(基于 OokiDialog)来获取一些参数。 那是 memory 没有释放的时候。

所以,对话框似乎有一些东西让它想要抓住这些对象,即使它们与对话框本身无关。

最后,我能够通过在它自己的任务中运行代码来“修复”问题:

Task taskA = Task.Run(() => MakeFiles(path, name));
taskA.Wait();

它让我再次工作,但我仍然喜欢一些关于为什么会这样的理论?

12 月 5 日更新

经过不断的挣扎,我决定将相关代码复制到一个可以进行实验的测试项目中。 复制后,我运行它,惊讶地发现 memory 在每次迭代时先升后降。 没有更多的“内存不足”!

仍在试图弄清楚如何/为什么。

更新 12 月 4 日

我已经排除了 GIF 编码器。 我注释掉了那部分代码,memory 还是涨涨涨涨。

我正在做很多加载图像并将它们的像素复制到字节[] arrays。 在大多数情况下,我一直非常小心地使用局部变量,所以它们不应该持续存在。

有什么方法可以告诉 object 的 object 或至少 class 正在创建那些“StreamAsIStream [强句柄]”引用吗? 原始问题

我已经对堆进行了一些分析,可以看到主要的罪魁祸首是 MemoryStreams。

我在几个地方使用 MemoryStream,但一直小心使用“使用”:

using (MemoryStream mem = new MemoryStream())
{
    ...
}

我注意到堆上的大多数流最终显示为:

StreamAsIStream [强句柄]

那个“强大的手柄”似乎是一个线索,也许? 即因为它是一个强大的句柄,GC 不会清理它?

我已经尝试明确处理流,然后强制垃圾 collections,但无论我做什么,他们似乎只是坚持下去,最终我得到 memory 错误。

可能是其他东西在内部使用 MemoryStream 并且我在错误的地方寻找吗?

有什么想法或其他我可以看的吗?

您可以调用stream.Close(); 释放 object 使用的 memory。 using 语句应该为您处理它,但我看到偶尔垃圾收集无法识别 object 不再使用的情况,特别是如果您碰巧使用 WPF。

您还可以尝试实现IDisposable接口,然后强制处理对象以及强制垃圾回收。 我已在此处为该过程链接了 Microsoft 文档。

Dispose()Close()的更详细描述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM