2009-12-08 5 views
6

Título al respecto. Aplicación WPF con algunas cosas WCF para IPC. Llamo al Application.Current.Shutdown() y la aplicación continúa felizmente. Pensé que Shutdown se suponía que era imparable.Application.Current.Shutdown() no

¿Quizás porque se está llamando desde un hilo de fondo? ¿Debo hacer algún cambio de despachador?

Respuesta

12

Obtiene una excepción cuando llamo al Application.Current.Shutdown en cualquier hilo que no sea el principal, así que supongo que ya usa correctamente el "violín del despachador".

En cualquier caso, esta compila y se cierra una aplicación, por lo que si el bit despachador no se parece a lo que tienes que podría honda en:

ThreadStart ts = delegate() 
    { 
     Dispatcher.BeginInvoke((Action)delegate() 
     { 
      Application.Current.Shutdown(); 
     }); 
    }; 
Thread t = new Thread(ts); 
t.Start(); 
+0

Estaba tratando de resolver esto y esto parece funcionar. ¿Hay alguna explicación de cómo envolver una llamada de operador en un hilo lo hace feliz? – StrikeForceZero

+0

Algunas clases usan subprocesos que no se ejecutan en segundo plano. Y Shutdown por lo general elimina solo los hilos de fondo automáticamente. Por lo tanto, debe intentar asegurarse de eliminar cualquier variable que utilice una clase que utilice el subprocesamiento antes de salir. – Zunair

10

Según mi experiencia, todos los hilos deben terminarse explícitamente o marcarse como hilos de fondo para que la aplicación se cierre.

Aquí es un ejemplo de dando inicio a un hilo de lectura en el fondo:

_readThread = new Thread(new ThreadStart(ReadThread)); 
_readThread.Name = "Receiver"; 
_readThread.Priority = ThreadPriority.Highest; 
_readThread.IsBackground = true; 
_readThread.Start(); 

La propiedad IsBackground es la clave. Sin eso, el hilo no terminará cuando llame a Shutdown.

+0

La aplicación se cierra normalmente por otros medios. – Thomas

+0

Muchas gracias por este comentario, me salvó un gran dolor de cabeza tratando de descubrir por qué mi aplicación no salía por completo. –

1

que sólo la experiencia Application.Current.Shutdown no funciona cuando estoy m ejecutándose desde Visual Studio. Dentro de Visual Studio (al menos la versión 2010 que estoy usando) Application.Current.Shutdown no hace nada. Si paso solo, ejecuta esta línea y luego continúa. Si ejecuto el programa (como un .exe) desde Windows Explorer, entonces Application.Current.Shutdown funciona bien.

Probablemente haya una explicación para esto ya que durante la depuración otros hilos están activos, pero no puedo explicarlo.

+0

Sí, lo mismo aquí, pero realmente se mete con mi depuración. – ProfK

Cuestiones relacionadas