如何将动态代码段更改为静态?

时间:2013-01-14 12:25:40

标签: c# winforms visual-studio-2010 memory

我在这个函数中失去内存警报,称为500K次:

public void DoStuff(string msg)
{
     rtfTerminal.Invoke(new EventHandler(delegate
            {
                rtfTerminal.SelectedText = string.Empty;
                rtfTerminal.AppendText(msg);
                rtfTerminal.ScrollToCaret();

            }));

}

在全球范围内,我声明:

  private System.Windows.Forms.RichTextBox rtfTerminal;
  • 我想我得到了内存不足,因为我每次都new EventHandler 打电话,我怎么能避免这个?
  • 因为我的内存不足是合理的 rtfTerminal.AppendText(msg);

2 个答案:

答案 0 :(得分:1)

new EventHandler不是一个大问题,也不是你真正看不到的匿名对象(但存在):这两个都是短命的,即GEN-0并且几乎是免费的去收集。此外,如果事情开始变低,GC将启动,因此不应该成为问题。不加限制地不断向RichTextBox添加文本可能是个问题。我会尽量避免这种情况。文件通常是从长时间运行的进程转储输出的更好选择。

最终,如果这没有帮助:你需要使用类似内存分析器的东西来查看内存的去向。

答案 1 :(得分:1)

内存不足异常可能会显示“调用”调用的行,但几乎可以肯定来自添加到richTextBox。

针对debug->例外 - > CLR抛出“抛出”以在调试时看到此异常。

每个ms的100个unicode字符应该每小时消耗大约686MB,检查任务管理器中的可用MB以查看这是否是罪魁祸首。