1. ホーム
  2. c#

[解決済み] ループ中のTextBox.Textへの追記は、繰り返しのたびに多くのメモリを消費するのはなぜですか?

2023-07-05 09:17:48

質問

短い質問

180,000回実行されるループがあります。各反復の終わりに、それはリアルタイムで更新されるTextBoxに結果を追加することになっています。

使用方法 MyTextBox.Text += someValue を使用すると、アプリケーションが大量のメモリを消費し、数千レコードの後に使用可能なメモリがなくなります。

にテキストを追加する、より効率的な方法はありますか? TextBox.Text に180,000回追加する、より効率的な方法はありますか?

Edit 私は本当にこの特定のケースの結果を気にしないが、私はこれがなぜメモリホッグであると思われるか、そしてTextBoxにテキストを追加する、より効率的な方法があるかどうかを知りたい。


長い(原文のまま)質問

CSVファイルでID番号のリストを読み込んで、それぞれのPDFレポートを生成する小さなアプリがあります。各PDFファイルが生成された後 ResultsTextBox.Text には、処理されたレポートのID番号が追加され、正常に処理されたことが表示されます。 プロセスはバックグラウンドスレッドで実行されるので、アイテムが処理されるとResultsTextBoxはリアルタイムに更新されます。

私は現在、18 万の ID 番号に対してアプリを実行していますが、アプリケーションが消費するメモリは時間が経つにつれて指数関数的に増加しています。最初は約 90K ですが、約 3000 レコードで約 250MB、4000 レコードで約 500MB のメモリをアプリケーションが消費しています。

Results TextBox への更新をコメントアウトすると、メモリは約 90K で比較的静止しているので、次のように記述すると推測できます。 ResultsText.Text += someValue と書くことでメモリを食いつぶしていると考えられます。

私の質問は、これはなぜですか?TextBox.Textにデータを追加する、メモリを消費しない良い方法は何でしょうか?

私のコードは次のようなものです。

try
{
    report.SetParameterValue("Id", id);

    report.ExportToDisk(ExportFormatType.PortableDocFormat,
        string.Format(@"{0}\{1}.pdf", new object[] { outputLocation, id}));

    // ResultsText.Text += string.Format("Exported {0}\r\n", id);
}
catch (Exception ex)
{
    ErrorsText.Text += string.Format("Failed to export {0}: {1}\r\n", 
        new object[] { id, ex.Message });
}

また、このアプリは 1 回限りのものであり、すべてのレポートを生成するのに数時間 (または数日 :) かかることは問題ではないことを述べておく必要があります。私の主な懸念は、システム メモリの制限に達すると、実行が停止されることです。

これを実行するために Results TextBox を更新する行をコメントアウトしたままにしておくことは構いませんが、私はデータを TextBox.Text にデータを追加する、よりメモリ効率の良い方法があるかどうかを知りたいです。

どのように解決するのですか?

メモリ使用量が多いのは、ユーザーがテキストの取り消し/やり直しができるように、テキストボックスがスタックを維持するためだと思われます。この機能はあなたのケースでは必要ないようなので、次のように設定してみてください。 IsUndoEnabled をfalseに設定してみてください。