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