Pregunta corta
Tengo un bucle que se ejecuta 180.000 veces. Al final de cada iteración, se supone que debe agregar los resultados a un TextBox, que se actualiza en tiempo real.
El uso MyTextBox.Text += someValue
hace que la aplicación consuma grandes cantidades de memoria y se quede sin memoria disponible después de unos pocos miles de registros.
¿Existe una forma más eficiente de agregar texto a TextBox.Text
180.000 veces?
Editar Realmente no me importa el resultado de este caso específico, sin embargo, quiero saber por qué esto parece ser una pérdida de memoria y si hay una forma más eficiente de agregar texto a un TextBox.
Pregunta larga (original)
Tengo una pequeña aplicación que lee una lista de números de identificación en un archivo CSV y genera un informe en PDF para cada uno. Después de que se genera cada archivo pdf, ResultsTextBox.Text
se agrega el número de identificación del informe que se procesó y que se procesó correctamente. El proceso se ejecuta en un hilo de fondo, por lo que ResultsTextBox se actualiza en tiempo real a medida que se procesan los elementos
Actualmente estoy ejecutando la aplicación con 180.000 números de identificación, sin embargo, la memoria que ocupa la aplicación está creciendo exponencialmente a medida que pasa el tiempo. Comienza por alrededor de 90K, pero por alrededor de 3000 registros ocupa aproximadamente 250 MB y por 4000 registros la aplicación está ocupando alrededor de 500 MB de memoria.
Si comento la actualización del Results TextBox, la memoria permanece relativamente estacionaria en aproximadamente 90K, por lo que puedo asumir que la escritura ResultsText.Text += someValue
es lo que está causando que se coma la memoria.
Mi pregunta es, ¿por qué es esto? ¿Cuál es una mejor manera de agregar datos a un TextBox.Text que no consume memoria?
Mi código se ve así:
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 });
}
También vale la pena mencionar que la aplicación es algo que se usa una sola vez y no importa que se necesiten algunas horas (o días :)) para generar todos los informes. Mi principal preocupación es que si alcanza el límite de memoria del sistema, dejará de funcionar.
Estoy bien con dejar la línea actualizando el Results TextBox comentado para ejecutar esto, pero me gustaría saber si hay una forma más eficiente de agregar datos a la memoria TextBox.Text
para proyectos futuros.
StringBuilder
para agregar el texto y luego, una vez completado, asignar elStringBuilder
valor al cuadro de texto.