2011-07-20 16 views
9

Por ejemplo, si tengo una página como esta:¿Cuándo se elimina una PhoneApplicationPage?

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"); 
    } 
} 

En la aplicación, que vaya a esta página, se mostrará un cuadro de mensaje cada 5 segundos. Luego presiono el botón "Atrás" en el teléfono y vuelvo a la página anterior. Pero lo extraño es que todavía aparece un cuadro de mensaje cada 5 segundos. Sé que puedo detener el temporizador en el método OnNavigatedFrom, pero ¿por qué sucede esto? ¿No se ha eliminado una página después de presionar el botón Atrás?

Gracias

+1

tiene el mismo problema y no puede entender por qué – Waleed

+1

+1: Como hemos encontrado al investigar esta pregunta: http://stackoverflow.com/questions/6762606/textbox-text-changes-itself-without-firing -textchanged-event-not-binding-problem/6763161 # comment-8020327 las páginas no se eliminan cuando se aleja de ellas. –

Respuesta

9

Se obtendrá dispuestas por la GC cuando nada es mantenerlo despierto. Este DispatcherTimer lo mantiene despierto, a pesar de que fue creado por la página. En el pasado, creo que DispatcherTimer está siendo referenciado por el propio Dispatcher, por lo que no puede limpiar, o algo por el estilo.

Para demostrar añadir un método finalize

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

A continuación, agregue un botón en algún lugar de la página principal para forzar un GC.Collect()

Si apaga el temporizador en OnNavigatedFrom su página asearse, si tu no, no lo hará

No he probado esto aún con Mango para ver si es más inteligente, pero con las herramientas 7.0 tuve que trabajar un poco para evitar esto.

+1

+1 para aclarar indirectamente la causa de otro problema: http://stackoverflow.com/questions/6762606/textbox-text-changes-itself-without-firing-textchanged-event-not-binding-problem/6763161#comment- 8020327 –

+0

Un DispatcherTimer mantendrá vivo un objeto siempre que los métodos del objeto estén vinculados al temporizador. (Desde MSDN) – CuiPengFei

2

Creo que el temporizador del despachador tiene una larga vida útil que la página, y un buen habito es detener o cancelar el manejador de eventos, por lo que la página tiene la fuga de memoria. Estoy estudiando el gc, es un tema difícil ... ..

Cuestiones relacionadas