Когда удаляется PhoneApplicationPage? - PullRequest
9 голосов
/ 21 июля 2011

Например, если у меня есть такая страница:

public partial class Page1 : PhoneApplicationPage
{
    DispatcherTimer timer = new DispatcherTimer();

    public Page1()
    {
        InitializeComponent();

        timer.Interval = TimeSpan.FromSeconds(5);
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
         MessageBox.Show("timer tick"); 
    }
}

В приложении, я перехожу на эту страницу, каждые 5 секунд появляется окно с сообщением. Затем я нажимаю кнопку «Назад» на телефоне и возвращаюсь на предыдущую страницу. Но странная вещь в том, что он по-прежнему всплывает в окне сообщения каждые 5 секунд. Я знаю, что могу остановить таймер в методе OnNavigatedFrom, но почему это происходит? Не открывается ли страница после нажатия на нее кнопки «Назад»?

Спасибо

Ответы [ 2 ]

9 голосов
/ 21 июля 2011

Он будет утилизирован GC, когда ничто не заставит его бодрствовать.Этот DispatcherTimer сохраняет бодрствование, даже если он был создан страницей.В прошлом я предполагал, что на DispatcherTimer ссылается сам Dispatcher, и поэтому он не может выполнить очистку или что-то в этом духе.

Для демонстрации добавьте метод финализации

#if DEBUG
  ~MyPage() {
    System.Diagnostics.Debug.WriteLine("Killing MyPage");
  }
#endif

Затем добавьте кнопку где-нибудь на главной странице, чтобы заставить GC.Collect()

Если вы выключите таймер в OnNavigatedFrom, ваша страница будет очищена, если вы этого не сделаете, она не будет.

Я еще не проверял это с Mango, чтобы убедиться, что он умнее, но с инструментами 7.0 мне пришлось немного поработать, чтобы обойти это.

2 голосов
/ 21 ноября 2012

Я думаю, потому что у таймера диспетчера больше времени жизни, чем у страницы, и хорошим привычкой является остановка или отмена обработчика событий, поэтому на странице есть утечка памяти. Я изучаю gc, это немного сложная тема .....

...