Увеличение использования памяти из CheckedListBox - это нормально? - PullRequest
1 голос
/ 09 октября 2019

Я разрабатываю инструмент C #, чтобы помочь мне в анализе файлов журналов для моей работы, и я использую Winforms для создания интерфейса. Я заметил, что каждый раз, когда я проверяю или отменяю отметку в элементе CheckedListBox, использование памяти моей программой немного увеличивается (максимум несколько сотен килобайт). Неоднократная проверка и снятие отметок приводит к тому, что программа увеличивает объем используемой памяти с 50 МБ до 150 МБ и продолжает расти.

Я контролировал использование памяти с помощью инструментов профилирования Visual Studio, dotMemory и диспетчера задач. Каждый подтверждает, что память набирает обороты, но я не уверен, почему.

Вот точка памяти:

enter image description here

Я не могунайдите «утечку» в моем коде, поэтому я протестировал проверку / снятие отметки с пустой Winform с рядом идентичных элементов в CheckedListBox и заметил, что память поднимается аналогично (хотя и в меньшей степени)!

Я, очевидно, новичок, когда дело доходит до C # и управления памятью. Я не уверен, стоит ли беспокоиться об этом, или я нетерпелив в отношении сборщика мусора. Хотя проблема, по-видимому, связана с неуправляемой памятью ...

Полный спагетти источник здесь , если вас это вообще заинтересовало.

1 Ответ

0 голосов
/ 10 октября 2019

В коде:

CheckListItem toAdd = CountMatches(item, splitFileContents);
    if (toAdd.Display != string.Empty)
        checkedListBoxMore.Items.Add(CountMatches(item, splitFileContents));

Вы создали toAdd объект, но перед тем, как не добавить его в контрольный список, вы создаете еще один. Используйте тот же объект для добавления в контрольный список:

CheckListItem toAdd = CountMatches(item, splitFileContents);
    if (toAdd.Display != string.Empty)
        checkedListBoxMore.Items.Add(toAdd);

Вы также можете освободить объект из памяти, используя метод Dispose, для события ControlRemoved:

checkedListBoxMore.ControlRemoved += (ss, ee) => {
            ee.Control.Dispose();
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...