2011-02-15 19 views
30

Tengo una gran mezcla de aplicaciones de C# y j #.Eliminando todos los hilos abiertos por la aplicación

A veces, cuando lo cierro, hay algunos subprocesos que no están cerrados y que están colgando en el administrador de tareas y que es imposible eliminarlos desde allí.

Tengo realmente un problema para encontrar todos los hilos y agregarlos al evento de cierre.

¿Hay alguna manera con violencia matan todas las discusiones que se abrieron por la aplicación en caso de cierre? ...

Gracias.

¿Hay alguna herramienta que pueda decirme qué hilos se abren mientras cierro la aplicación y quién los abrió?

+0

Ver también: [Apagar una aplicación multiproceso] (http: // stackoverflow.com/questions/2314861/shutting-down-a-multiproceso-aplicación) –

Respuesta

42

Esto no debería estar pasando, y si es así, está tratando de solucionarlo de la manera incorrecta.

Cuando su aplicación finaliza, .NET Framework matará automáticamente cualquier subproceso cuyo IsBackground property se establece en "True". Designe cada uno de sus hilos de trabajo como hilos de fondo, y ya no tendrá este problema. Aprovechar el BackgroundWorker class y el ThreadPool class, que crean automáticamente subprocesos en segundo plano, es una opción mucho mejor.

De lo contrario, debe limpiar los hilos de primer plano explícitamente. Una aplicación diseñada correctamente hará su propia contabilidad y tendrá una forma determinista y estructurada de garantizar que todos sus hilos se hayan cerrado antes de salir del método Main. Esto es lo que debe hacer de todos modos si sus subprocesos requieren una finalización elegante.

Asesinar al proceso es una muy mala idea, ya que dejar que tus hilos se ejecuten de cualquier manera en tu aplicación.

+2

Funciona para mí –

+0

Bueno, sí, esta es una buena explicación ... Pero, ¿qué sucede si llamas a un servicio web de WCF desde un hilo donde el servicio está bloqueado en un estado indefinido? No puedes esperar sin parar Debes matar ese hilo. No hay otra manera o estoy equivocado? – Patrik

+2

No mata el hilo, llama al servicio web con un tiempo de espera. @patrik –

4

Bueno, podría llamar al Application.Exit() pero eso no será de mucha ayuda. La conclusión es que tiene que cerrar con gracia todos los hilos usted mismo si quiere hacer las cosas correctamente.

+1

No funcionó. Creo que quisiste decir 'Environment.Exit()' como en la otra respuesta, eso funciona. –

0

Mis 2 centavos ... a todas las respuestas ...

tratar de forzar PARADA

Poner en void CurrentApplication_Exit(object sender, ExitEventArgs e) y private void Window_Closing(object sender, CancelEventArgs e) esas líneas

System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
System.Windows.Application.Current.Shutdown(); 
13

Usted puede utilizar: Environment.Exit (0); , que apagará la aplicación si se están ejecutando subprocesos y no causará ningún problema.

+0

esto funcionó junto con la configuración de 'IsBackground' La propiedad de thread está establecida en' True' –

0
internal void Close() 
{ 
    Dispatcher.CurrentDispatcher.Thread.Abort(); 
    Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
    Application.Current.Shutdown(); 
} 
+0

pero se ve mejor Environment.Exit (0); – Mario

+8

La respuesta será más útil si agrega una descripción al bloque de código. – kukido

1

Debe cerrar los hilos con gracia, sino que sólo quiere que usted y otros conocen el camino que no es recomendable pero posible:

en su Handler OnClose:

System.Diagnostics.Process.GetCurrentProcess().Kill(); 

estoy totalmente prefiero Cody Gray forma de hacerlo.

Cuestiones relacionadas