В настоящее время я пишу приложение, которое в основном использует DispatcherTimer для эмуляции функции секундомера. Хотя мой DispatcherTimer работает в приложении, использование памяти моего приложения увеличивается до 100 МБ менее чем за 10 минут, что особенно странно, учитывая, насколько просты функциональность приложения. Это, как правило, не было проблемой, кроме того, что быстрое увеличение использования памяти приложения приводит к сбою и завершению работы. Я смотрел по всему Интернету и неоднократно сталкивался с статьями, подтверждающими существование утечки памяти DispatcherTimer, однако все исправления этой утечки памяти состоят в остановке DispatcherTimer, когда она больше не нужна. Моя утечка памяти происходит, когда DispatcherTimer по-прежнему нужен, а не когда он случайно оставлен. Мне нужно разрешить пользователям поддерживать свою работу секундомера в течение как бы долго они ни выбрали, поэтому остановка DispatcherTimer, когда она больше не нужна, больше не делает для меня. Я попытался добавить GC.Collect() в конце обработчика событий TimerTick, однако, похоже, это тоже не так.DispatcherTimer продолжает увеличивать использование памяти до тех пор, пока не завершится авария приложения
public MainPage()
{
InitializeComponent();
PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled;
Timer.Stop();
Timer.Interval = new TimeSpan(0, 0, 1);
Timer.Tick += new EventHandler(TimerTick);
Loaded += new System.Windows.RoutedEventHandler(MainPage_Loaded);
}
void TimerTick(object sender, EventArgs e)
{
timeSpan1 = DateTime.Now.Subtract(StartTimer);
timeSpan2 = DateTime.Now.Subtract(StartTimer2);
WatchHour.Text = timeSpan1.Hours.ToString();
WatchMinute.Text = timeSpan1.Minutes.ToString();
WatchSecond.Text = timeSpan1.Seconds.ToString();
SecondaryHour.Text = timeSpan2.Hours.ToString();
SecondaryMinute.Text = timeSpan2.Minutes.ToString();
SecondarySecond.Text = timeSpan2.Seconds.ToString();
if (WatchHour.Text.Length == 1) WatchHour.Text = "0" + WatchHour.Text;
if (WatchMinute.Text.Length == 1) WatchMinute.Text = "0" + WatchMinute.Text;
if (WatchSecond.Text.Length == 1) WatchSecond.Text = "0" + WatchSecond.Text;
if (SecondaryHour.Text.Length == 1) SecondaryHour.Text = "0" + SecondaryHour.Text;
if (SecondaryMinute.Text.Length == 1) SecondaryMinute.Text = "0" + SecondaryMinute.Text;
if (SecondarySecond.Text.Length == 1) SecondarySecond.Text = "0" + SecondarySecond.Text;
}
Это мой TimerTick обработчик событий и немного моего MainPage конструктора, в текстовые поля, присутствующие в обработчик событий отображается время, прошедшее с начала секундомера. Я делаю что-то совершенно неправильное здесь, что вызывает такое огромное увеличение памяти? Ранее я думал, что проблема заключается в том, что TextBoxs каким-то образом кэшировали свое предыдущее содержимое по умолчанию в сочетании с быстрыми изменениями текста из-за функциональности секундомера, однако, после полного удаления TextBoxes из моего приложения и анализа его, я совершенно уверен, что они aren Проблема. Как указано выше, добавление GC.Collect() в конце этого обработчика TimerTick не сделало ничего, чтобы уменьшить использование моей памяти. Кто-нибудь имеет представление о том, как я могу уменьшить использование памяти с помощью DispatcherTimer, возможно, каким-то образом манипулируя функцией GC, чтобы на самом деле работать?
Заранее благодарен!
Как насчет остановки таймера в начале события тика, И снова начинать его в конце? –
Я не думаю, что проблема связана с кодом выше. Преступник это где-то еще, я подозреваю. BTW использует 'WatchHour.Text = timeSpan1.Hours.ToString («00»); 'для достижения правильного форматирования по мере необходимости. –
Возникла ли ошибка приложения, если вы позволили ему работать, или память перестает увеличиваться в какой-то момент? –