短缺問題爲什麼一個循環過程中追加到TextBox.Text佔用更多的內存每次迭代?
我有一個運行18萬次的循環。在每次迭代結束時,它應該將結果附加到實時更新的TextBox。
使用MyTextBox.Text += someValue
導致吃大量內存的應用程序,它經過幾千年的記錄耗盡可用內存。
是否有附加文本到TextBox.Text
18萬次的更有效的方法?
編輯我真的不關心這種特殊情況下的結果,但是我想知道爲什麼這似乎是一個內存豬,如果有將文本追加到一個TextBox更有效的方式。
龍(原件)問題
我有一個小的應用程序,它讀取一個CSV文件ID號的列表,併產生爲每一個PDF報告。生成的每個pdf文件後,ResultsTextBox.Text
被附加一個得到處理報表的ID號,並且它被成功處理。 過程在後臺線程上運行,所以ResultsTextBox得到更新項目得到處理
我目前正在運行鍼對18萬ID號的應用,但是應用程序內存佔用成倍增長,隨着時間的實時過去了。它首先90K左右,而是由約3000條記錄它佔用了大約250MB和4000記錄應用程序佔用大約500 MB的內存。
如果我註釋掉結果文本框的更新,內存在大約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 });
}
這也應該是值得一提的是,應用程序是一個一次性的事情,沒關係,這是要花費幾個小時(或幾天:))來生成所有的報告。我主要關心的是,如果它達到系統內存限制,它將停止運行。
我很好,離開行更新結果文本框註釋掉運行這個東西,但我想知道是否有更多的內存有效的方式將數據追加到TextBox.Text
爲未來的項目。
你可以嘗試使用'StringBuilder'來追加文本,然後在完成時將'StringBuilder'值賦給文本框。 – keyboardP 2012-01-04 20:59:02
@keyboardP我忘了提到在後臺線程上運行的循環,並且結果文本框實時更新 – Rachel 2012-01-04 21:01:06
我不知道它是否會改變任何事情,但如果你有一個StringBuilder會附加新的Id-s並且您將使用一個屬性,該屬性使用字符串構建器的新值進行更新,並將其綁定到textbox.text屬性。 – BigL 2012-01-04 21:01:37