短缺问题为什么一个循环过程中追加到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