内存使用率很高

时间:2014-04-30 10:48:15

标签: c# memory richtextbox

我的Windows应用程序有一个只有一个RichTextBox的表单。在运行时,我正在加载一个文本文件。文本文件大小约为18MB。当我运行应用程序时,任务管理器中显示的初始内存大小为9 MB。在RichTextBox加载语句执行后不久,内存大小变为164MB。为什么18 MB的文字文件正在消耗164MB

为了进一步研究,我在Button上点了Form,点击了RichTextBoxGC.Collect()的处理。但是,这无法将记忆恢复到初始水平。内存使用率降至55MB

有人可以告诉我为什么我没有释放完整的内存吗?

以下是用于填充RichTextBox的代码:

using (FileStream fileStream = File.OpenRead(m_strFileName))
            {
                MemoryStream memStream = new MemoryStream();
                memStream.SetLength(fileStream.Length);
                fileStream.Read(memStream.GetBuffer(), 0, (int)fileStream.Length);
                rchtxtTextFile.LoadFile(memStream, RichTextBoxStreamType.PlainText);
                memStream.Dispose();
            }

我的应用程序将允许用户加载一些大文件,这些文件实际上是HTML文件。用户将在RichTextBox编辑器中的HTML标记中进行一些更正。这些文件大约为140MB。加载此文件会导致内存不足异常。这就是为什么我发现为什么在处理表格时不回收整个记忆的原因。

2 个答案:

答案 0 :(得分:2)

因为RichTextBox被称为重控制。它需要创建内部结构才能管理内容的自定义格式。

如果您只需要显示文本而不需要任何特殊格式,请考虑使用简单的多行TextBox

  

我在表单上放了一个按钮,点击它的Dispose of   RichTextBox和GC.Collect()。但这无法回收记忆   到初始水平。内存使用量降至仅55MB

GC 无法保证收回所有内容。 GC.Collect只是.NET环境开始扫描垃圾的信号。记忆的相关部分已经被回收的事实是一件好事。其余部分由RichTextBox生成的引用占用。

编辑

当然,要正确理解应用程序的内存分布,您需要在内存分析器中执行它。

答案 1 :(得分:0)

根据RTF文件的大小判断(18MB对于文本很多,甚至丰富的文本)我猜它包含图片。出于向后兼容性原因,大多数Windows应用程序中的RTF格式在保存图片时使用2种格式 - 原始和未压缩的WMF(Windows图元文件格式)。

某些富文本控件(如DevExpress')支持关闭此功能