简短问题
我有一个运行18万次的循环。在每次迭代结束时,都应将结果附加到TextBox,并实时更新。
使用MyTextBox.Text += someValue
将导致应用程序占用大量内存,并且在记录了数千条之后耗尽了可用内存。
有没有一种更有效的方式将文本附加到TextBox.Text
18万次?
编辑我真的不在乎这种特殊情况的结果,但是我想知道为什么这似乎是一个内存消耗,以及是否存在一种将文本追加到TextBox的更有效的方法。
长(原始)问题
我有一个小应用程序,可以读取CSV文件中的ID号列表,并为每个文件生成PDF报告。生成每个pdf文件后,将在其后ResultsTextBox.Text
附加已处理且已成功处理的报告的ID号。该进程在后台线程上运行,因此,在处理项目时,ResultsTextBox会实时更新
我目前正在针对180,000个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
值分配给文本框。