0

500Kこの関数で、 timesと呼ばれるメモリ不足のアラートが発生しています。

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);ですか?
4

2 に答える 2

1

これnew EventHandlerは大きな問題ではなく、実際には見ることができない(しかし存在する)匿名オブジェクトでもありません。これらは両方とも短命であり、つまりGEN-0であり、事実上自由に収集できます。さらに、物事が少なくなり始めた場合、GCが作動するので、それは問題ではないはずです。RichTextBox無制限にテキストを継続的に追加すると、問題が発生する可能性があります。私はそれを避けようとします。通常、ファイルは、実行時間の長いプロセスからの出力をダンプするためのより良いオプションです。

最終的に、それが役に立たない場合:メモリがどこに行くのかを確認するには、メモリプロファイラーのようなものを使用する必要があります。

于 2013-01-14T12:32:17.380 に答える
1

メモリ不足の例外は、「invoke」呼び出しの行に対して表示される場合がありますが、ほぼ確実に、richTextBoxへの追加から発生しています。

デバッグ中にこれを確認するには、debug-> exceptions->CLRExceptionsに対して「throw」にチェックマークを付けます。

1ミリ秒ごとに100個のUnicode文字が1時間に約686MBを消費するはずです。タスクマネージャで使用可能なMBをチェックして、これが原因かどうかを確認してください。

于 2013-01-14T13:32:01.977 に答える