[解決済み] ループ中のTextBox.Textへの追記は、繰り返しのたびに多くのメモリを消費するのはなぜですか?
質問
短い質問
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に設定してみてください。
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み】.NETで文字列が不変なら、なぜSubstringはO(n)時間かかるの?
-
[解決済み】.NETのforeachループでコレクションがNULLの場合、NullRefExceptionが投げられるのはなぜですか?
-
[解決済み] Environment.Exit()でプログラムが終了しなくなったのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】文字列を連結する最も効率的な方法は?
-
[解決済み] String.FormatはStringBuilderと同じように効率的か?