Коротке запитання
У мене є цикл, який запускається 180 000 разів. В кінці кожної ітерації передбачається додавати результати до TextBox, який оновлюється в режимі реального часу.
Використання MyTextBox.Text += someValue
змушує програму з’їдати величезну кількість пам’яті, і вона втрачає доступну пам’ять через кілька тисяч записів.
Чи існує більш ефективний спосіб додавання тексту до TextBox.Text
180 000 разів?
Редагувати Мені справді байдуже про результат цього конкретного випадку, однак я хочу знати, чому це, здається, свиня пам’яті, і чи є більш ефективний спосіб додавання тексту до TextBox.
Довге (оригінальне) запитання
У мене є невеликий додаток, який читає список ідентифікаційних номерів у файлі CSV і створює звіт PDF для кожного з них. Після створення кожного pdf-файлу ResultsTextBox.Text
додається додається ідентифікаційний номер звіту, який був оброблений, і що його було успішно оброблено. Процес виконується у фоновому потоці, тому ResultsTextBox оновлюється в режимі реального часу в міру обробки елементів
Зараз я запускаю програму проти 180 000 ідентифікаційних номерів, однак пам’ять, яку забирає програма, з часом зростає в геометричній прогресії. Він починається приблизно з 90 тис., Але приблизно до 3000 записів займає приблизно 250 Мб, а до 4000 записів програма займає близько 500 Мб пам'яті.
Якщо я коментую оновлення результатів TextBox, пам’ять залишається відносно нерухомою і становить приблизно 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 });
}
Слід також зазначити, що додаток - це разова справа, і не має значення, що для створення всіх звітів знадобиться кілька годин (або днів :)). Моє головне занепокоєння полягає в тому, що якщо він досягне обмеження системної пам’яті, він перестане працювати.
Я чудово залишаю рядок для оновлення результатів, який TextBox прокоментував для запуску цієї речі, але я хотів би знати, чи існує більш ефективний спосіб додавання даних до даних TextBox.Text
для майбутніх проектів.
StringBuilder
для додавання тексту, після чого, після завершення, присвоїтиStringBuilder
значення текстовому полі.