Таблица NewRow () вызывает утечку памяти
-
04-07-2019 - |
Вопрос
Во время исследования утечки памяти я обнаружил, что она была вызвана многократным вызовом NewRow () для Table внутри цикла. Однако созданный DataRow никогда не добавлялся в коллекцию Table Rows, и количество строк в таблице никогда не превышало ноль.
Мой вопрос: почему при каждом вызове NewRow используется больше памяти, хотя вновь созданный DataRow никогда не добавляется в коллекцию Rows, а DataRow, возвращаемый из NewRow, всегда присваивается одной и той же локальной переменной (таким образом, очевидно, отбрасывая последний новый ряд).
Пожалуйста, не обращайте внимания на то, почему код создает строки данных, которые не добавляются в таблицу!
Решение
DataRow наследует схему от DataTable, поэтому есть ссылки из DataRow на схему таблицы, которая сгенерировала строку. Новая строка находится в отдельном состоянии в таблице.
Вот почему GC оставил новые неиспользованные строки в покое. Р>
Другие советы
DataTable.NewRow () добавляет созданную строку в RecordManager в DataTable. Я не совсем уверен, почему это происходит, но именно поэтому он не освобожден GC.
Похоже, что существует только два способа избавиться от DataRow:
<Ол>Я думаю, что ваши две проблемы связаны. Р>
Table.NewRow создает новую строку данных, которая имеет тот же формат столбца, что и исходная таблица.
Эту новую строку необходимо добавить в таблицу с помощью table.Rows.Add (newRow). Ваш цикл будет создавать объекты, которые никогда не используются, и, следовательно, будет поглощать память. Смотрите эту статью для получения дополнительной информации http://msdn.microsoft.com/en- нас / библиотека / system.data.datatable.newrow.aspx
Если вы создадите newRow = table.NewRow () и затем в приведенном ниже коде определитесь, чем этот newRow вам больше не нужен. 1) Добавьте строку if в таблицу. 2) Удалите, это предотвратит утечку памяти.
var table = new DataTable();
while (true)
{
var newRow = table.NewRow();
table.Rows.Add(newRow); //Without this 2 rows you will have memory leak.
table.Rows.Remove(newRow);//
}