Pregunta Eliminando todos los hilos abiertos por la aplicación


Tengo una gran mezcla de aplicaciones de c # y j #.

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

Realmente tengo problemas para encontrar todos esos hilos y agregarlos al evento de cierre.

¿Hay alguna manera de matar violentamente a todos los hilos que se abrieron por la aplicación en el evento de cierre? ...

Gracias.

¿Hay alguna herramienta que me pueda decir qué hilos están abiertos mientras cierro la aplicación y quién los abrió?


31
2018-02-15 10:12


origen


Respuestas:


Esta no debería estar pasando, y si es así, estás tratando de abordarlo de la manera incorrecta.

Cuando su aplicación finalice, el .NET Framework matará automáticamente cualquier hilo cuyo IsBackground propiedad está configurado a "Verdadero". Designe cada uno de sus hilos de trabajo como hilos de fondo, y ya no tendrá este problema. Aprovechando el BackgroundWorker clase y el ThreadPool clase, que crea automáticamente subprocesos en segundo plano, es una opción mucho mejor.

De lo contrario, debe limpiar sus 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 Main método. Esto es lo que deberías estar haciendo de todas formas si tus hilos requieren una terminación elegante.

Matar el proceso es una muy mala idea, como dejar que tus hilos funcionen de cualquier manera en tu aplicación.


45
2018-02-15 10:18



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


13
2018-05-05 22:09



Bueno, podrías llamar 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.


4
2018-02-15 10:15



Debe cerrar sus hilos con gracia, pero solo quiere que usted y otros conozcan la forma en que no se recomienda pero es posible:

en su controlador OnClose:

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

Prefiero la forma de hacerlo de Cody Gray.


2
2018-05-05 06:31



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

Intenta forzar SHUTDOWN

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();

0
2018-04-18 12:51



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

0
2018-01-08 03:52