Проблема памяти с приложением в C # Windows Forms - PullRequest
1 голос
/ 22 мая 2011

У меня есть приложение на C #, которое резервирует слишком много памяти, когда этого не предполагалось.Размер исполняемого файла ~ 100 КБ, а всего приложения - несколько тысяч строк кода.
Это основной компонент, имеющий таймер, который отвечает за создание событий (экземпляров класса с несколькими атрибутами) и отправку их этому http://timeline.codeplex.com/. Способ, которым временная шкала принимает события, - это вызов функции ResetEvents и передача списка событий.Поскольку у меня есть таймер, я поместил его в код таймера.
При его запуске приложение загружает до 300 МБ памяти, и я просто заканчиваю его, чтобы избежать сбоя.Если я уберу вызов ResetEvents из таймера, то приложение будет работать более плавно, потребляя 60-70Mb.Приложение без временной шкалы должно работать на 10-20Мб.Там нет графики или что-то, что могло бы использовать больше, чем это.Я думаю, что что-то может быть не так с временной шкалой.

РЕДАКТИРОВАТЬ:

Вот часть кода:

List<TimelineEvent> events = new List<TimelineEvent>();

...

внутренний таймер

TimelineLibrary.TimelineEvent newevent = new TimelineLibrary.TimelineEvent();
...
newevent.StartDate = starttime;
newevent.EndDate = endtime;
newevent.Id = id;
newevent.Title = title;
newevent.Description = description;
newevent.Link = url;
newevent.EventColor = color;

events.Add(newevent);

timeline.ResetEvents(events);

...

Этот код находится внутри таймера.Я просто создаю TimelineEvent, добавляю его в список и вызываю ResetEvents.Удаление последней строки не вызывает проблем с памятью.

Ответы [ 2 ]

2 голосов
/ 22 мая 2011

Поскольку очень трудно понять, в чем заключается ваша проблема без дополнительного кода, я предлагаю попробовать какой-нибудь профилировщик памяти , чтобы определить, где и когда будет выделена память.

Попробуйтепример RedGates Memory Profiler , у них есть пробная версия на основе времени.
Выполните этот обход , чтобы набрать скорость и немного узнать, что искать и как.

Дополнительные параметры профилей памяти .NET см. В этой теме .

Удачи!

0 голосов
/ 23 мая 2011

Какого типа переменная events, которую вы передали ResetEvents?

Не видя код, единственное подозрительное поведение, которое я могу описать в том, что вы опубликовали, - это, возможно, ResetEventsМетод на самом деле не очищает полученную коллекцию, но вместо этого что-то делает с состоянием переменной timeline.

Использование профилировщика памяти - отличная идея.Если вы ожидаете, что люди помогут вам найти утечку памяти, пожалуйста, опубликуйте больше своего кода.В идеале вы могли бы воспроизвести проблему с минимальным кодом, а затем опубликовать это.

...