短い質問
180,000回実行されるループがあります。各反復の終わりに、リアルタイムで更新されるTextBoxに結果を追加することになっています。
を使用するMyTextBox.Text += someValue
と、アプリケーションが大量のメモリを消費し、数千レコード後に使用可能なメモリが不足します。
TextBox.Text
180,000回にテキストを追加するより効率的な方法はありますか?
編集私はこの特定のケースの結果を本当に気にしませんが、なぜこれがメモリを大量に消費しているように見えるのか、そしてテキストボックスにテキストを追加するより効率的な方法があるかどうかを知りたいです。
長い(元の)質問
CSVファイルのID番号のリストを読み取り、それぞれのPDFレポートを生成する小さなアプリがあります。各pdfファイルが生成された後、ResultsTextBox.Text
処理され、正常に処理されたレポートのID番号が追加されます。プロセスはバックグラウンドスレッドで実行されるため、アイテムが処理されると、ResultsTextBoxがリアルタイムで更新されます。
現在、180,000のID番号に対してアプリを実行していますが、アプリケーションが使用しているメモリは、時間の経過とともに指数関数的に増加しています。開始時は約90Kですが、約3000レコードで約250 MBを占有し、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
、将来のプロジェクトのためにデータを追加するためのよりメモリ効率の高い方法があるかどうかを知りたいです。
StringBuilder
てテキストを追加し、完了したら、StringBuilder
値をテキストボックスに割り当ててみてください。