Почему скачет память?

Нужно создать пользовательский элемент.
Создаю:
public class MyControl : Control
{
...
}


Отрисовываю следующим образом как в доках:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    ...
}


В самом элементе отрисовывается анимация, рисуется объект через таймер и в каждой итерации изменяются координаты.

Суть вот в чем, если просто один раз отрисовать контрол, то с памятью все хорошо, смотрим в диспетчере задач - она не изменяется. Ресайзим форму - используемая память растет, это вроде как логично.

Но, если в цикл добавить

this.Invalidate();

То память начинает сразу расти после запуска приложения, потом правда останавливается на каком-то значении но все же.

Даже если писать

this.Invalidate(region);

Где region необходимый квадрат для перерисовки, ничего не изменяется, даже если поставить region с параметрами (0, 0, 1, 1), память растет. Более того, если просто оставить в цикле Invalidate при этом вообще ничего на форме не отрисовывать, память тоже растет. В цикле таймера нет никаких выделений памяти, убираю их таймера все кроме Invalidate память все равно растет сразу без ресайза окна.

Как быть? Требования такие что память не должна скакать.
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 3
Visual Studio 2015, во время запуска справа появится окно в котором можно снимать снэпшоты памяти, и сравнивая их находить те объекты которых стало больше. Выяснить кто их создает и для чего.
Ответ написан
denis79513
@denis79513 Автор вопроса
А теперь я вообще в тупике, визуалка вон что говорит, но в диспетчере задач за это время пвмять растет на 2,5 метра.
36fb220bf77f48cc91addc38b294c346.jpg
Ответ написан
AxisPod
@AxisPod
Зачем в WPF рисовать как в Windows Forms?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы