2011-12-15 7 views
5

Aquí hay un fragmento de código en el que aparece un cuadro de diálogo simple ("selector"). Según la entrada del usuario, la aplicación puede finalizar.¿Por qué mi programa C# WPF sigue ejecutando líneas después de Application.Shutdown()?

DPChooser chooser = new DPChooser(dataProvider); 
    if (chooser.ShowDialog() == false) 
     Application.Current.Shutdown(0); 
    else 
     ApplicationContext.Current.InitializeDataProviderAPI(chooser.DataProvider); 
    } 

    // more code continues here 
    // THE PROBLEM: 
    //  Even when Shutdown() above is called, 
    //  the execution continues proceeding past here! 

me he encontrado en un depurador, por lo que saben que el si está evaluando a falso, y yo saben que apagado() que se está llamando.

Entonces, ¿por qué no se apaga?

Nota: creo que no es una cosa de enhebrar. Todavía no estoy comenzando nada en otros hilos. Incluso si el enhebrado estaba involucrado, aún no esperaba que el código en este hilo siguiera pasando por Shutdown().

Respuesta

10

El apagado detiene el procesamiento de Dispatcher y cierra la aplicación en lo que se refiere a WPF, pero en realidad no elimina el hilo actual.

En su caso, debe evitar que se ejecute código más allá de esa llamada. Un retorno simple será suficiente:

if (chooser.ShowDialog() == false) 
{ 
    Application.Current.Shutdown(0); 
    return; 
} 
else { //... 
+0

Je, eso no es tan intuitivo. Sin embargo, debería haber pensado en regresar allí, sin importarme nada. Gracias. –

+0

Espere, los documentos de Shutdown (int exitCode) indican que exitCode se devuelve al sistema operativo. Si este método no mata a la aplicación, ¿cómo puede la aplicación usarla para devolver este exitCode? –

+0

@GrantB Es un apagado controlado, que no detiene el hilo de ejecución. Si usa la tubería WPF predeterminada, este código de salida es lo que se devuelve desde el punto de entrada, pero ocurre después de que se ejecuta todo lo demás (como ha descubierto aquí). –

2

No finaliza su proceso instantáneamente, es un apagado controlado.

si lo desea (no se recomienda) para matar al instante

Process.GetCurrentProcess().Kill(); 
+0

Environment.Exit() también funciona, pero sabía que tampoco era deseable. –

Cuestiones relacionadas