Короткий вопрос
У меня есть цикл, который выполняется 180 000 раз. В конце каждой итерации предполагается добавлять результаты в TextBox, который обновляется в реальном времени.
Использование MyTextBox.Text += someValueприводит к тому, что приложение съедает огромное количество памяти, и у него заканчивается доступная память после нескольких тысяч записей.
Есть ли более эффективный способ добавления текста до TextBox.Text180 000 раз?
Изменить Меня действительно не волнует результат этого конкретного случая, однако я хочу знать, почему это похоже на потребление памяти, и есть ли более эффективный способ добавления текста в TextBox.
Длинный (оригинальный) вопрос
У меня есть небольшое приложение, которое считывает список идентификационных номеров в файле CSV и генерирует отчет в формате PDF для каждого из них. После создания каждого файла PDF к нему ResultsTextBox.Textдобавляется идентификационный номер отчета, который был обработан и был успешно обработан. Процесс выполняется в фоновом потоке, поэтому ResultsTextBox обновляется в реальном времени по мере обработки элементов.
В настоящее время я использую приложение для 180000 идентификационных номеров, однако объем памяти, который занимает приложение, со временем растет экспоненциально. Он начинается примерно с 90 КБ, но примерно на 3000 записей он занимает примерно 250 МБ, а на 4000 записей приложение занимает около 500 МБ памяти.
Если я закомментирую обновление текстового поля результатов, память останется относительно постоянной на уровне примерно 90 КБ, поэтому я могу предположить, что запись 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 });
}
Следует также отметить, что приложение является одноразовым, и не имеет значения, что на создание всех отчетов уйдет несколько часов (или дней :)). Меня больше всего беспокоит то, что если он достигнет предела системной памяти, он перестанет работать.
Я согласен оставить строку, обновляющую текстовое поле результатов, закомментированную, чтобы запустить эту вещь, но я хотел бы знать, есть ли более эффективный способ добавления данных в a TextBox.Textдля будущих проектов.
StringBuilderдля добавления текста, а затем, по завершении, присвоитьStringBuilderзначение текстовому полю.