Algunas veces la aplicación no puede salir cuando llamé a Application.Shutdown, la IU estaba cerrada, pero el proceso aún se está ejecutando. ¿Cómo cerrar la aplicación con cerrar todos los hilos? ¿el Environment.Exit() podría cerrar todo el hilo? o deberíamos llamar a Win32 API TerminateThread para hacerlo?¿cuál es la diferencia entre Environment.Exit() y Application.Shutdown()?
Respuesta
Environment.Exit() es una forma más brutal de cerrar su aplicación, sí, pero en general si necesita matar su aplicación para cerrarla, entonces creo que está mirando el problema de la manera incorrecta. Deberías mirar más bien por qué los otros hilos no se cierran con gracia.
Puede consultar el formulario FormClosing event en el formulario principal y cerrar todos los recursos que estén colgando la aplicación evitando que se cierre.
Así es como he encontrado recursos para colgar la aplicación.
- En el modo de depuración permiten proyección de threads (Esto le permitirá ver todos los hilos que se ejecuta la aplicación)
- cerrar la aplicación en la forma en que no se cierra correctamente.
- Presione pausa en Visual Studio
- Mire la lista de hilos y haga clic en ellos para ver dónde están colgando el código, ahora que puede ver qué recursos bloquean el cierre de su aplicación vaya a su evento FormClosing y cerrar/desecharlos allí.
- Repita hasta que la aplicación se cierra correctamente :)
Tenga en cuenta que la lista de temas en el modo de depuración mostrará algunos hilos que se ejecutan pero no bajo su control, estos hilos rarly tienen un nombre y cuando se hace clic en les aparece un mensaje que dice que no tienes símbolos. Estos pueden ser ignorados de forma segura
Una de las razones para asegurarse de que su aplicación se cierra correctamente es que si algunos recursos (digamos un FileStream) no funciona, use una API para forzarlo a hacer todo tipo de cosas rápidamente. de problemas "aleatorios", como configuraciones/archivos de datos que no se escriben, etc.
- Debe NUNCA llamada TerminateThread
- Asegúrese de que todos los hilos que son desovar marca como fondo, de esta manera cuando se cierra la aplicación no va a esperar a que se completen.
Oh, increíble. No sabía que podrías hacer # 2. – Joel
IsBackground resolvió este problema para mí. Muy útil, sorprende que no sea más ampliamente conocido. – SouthShoreAK
Como dijo Shay, NUNCA se llama TerminateThread, TerminateThread elimina solo un hilo sin dejarlo limpiar por sí mismo, lo que puede llevar a bloqueos y daños en otros hilos en el proceso.
TerminateProcess en el otro habría matado todo el proceso y dejaría que el sistema operativo se limpiara, es la forma más rápida de cerrar un proceso; solo tiene que asegurarse de no tener recursos que el SO no pueda limpiar (también ayuda a cerrar ventanas antes de llamar a TerminateProcess).
Creo, pero no lo he comprobado, que Environemnt.Exit llama a TerminateProcess.
Application.Shutdown es muy diferente, no elimina el proceso de inmediato, envía todas las notificaciones de cierre y apagado y espera a que todas las ventanas y subprocesos de la aplicación se cierren.
- 1. Diferencia entre Environment.Exit y simple retorno 2 de la principal
- 2. ¿Cuál es la diferencia entre {0} y ""?
- 3. Cuál es la diferencia entre = y: =
- 4. ¿Cuál es la diferencia entre .ToString (+) y ""
- 5. Cuál es la diferencia entre $ (...) y `...`
- 6. ¿cuál es la diferencia entre:.! y: r !?
- 7. ¿Cuál es la diferencia entre ".equals" y "=="?
- 8. ¿Cuál es la diferencia entre dict() y {}?
- 9. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 10. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 11. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 12. ¿Cuál es la diferencia entre + = y = +?
- 13. ¿Cuál es la diferencia entre " " y ""?
- 14. Cuál es la diferencia entre $ y jQuery
- 15. OpenGL (ES) - ¿Cuál es la diferencia entre frustum y orto?
- 16. Cuál es la diferencia entre la función() {}() y la función() {}()
- 17. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
- 18. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
- 19. ¿Cuál es la diferencia entre la vinculación estática y dinámica?
- 20. ¿Cuál es la diferencia entre la sección .got y .got.plt?
- 21. ¿Cuál es la diferencia entre el colado y la coerción?
- 22. ¿cuál es la diferencia entre el complemento y la biblioteca?
- 23. ¿Cuál es la diferencia entre el casting y la conversión?
- 24. ¿Cuál es la diferencia entre WPF y la aplicación Silverlight?
- 25. ¿Cuál es la diferencia entre uno mismo y la ventana?
- 26. ¿Cuál es la diferencia entre CookieContainer y la colección Response.Cookies?
- 27. ¿Cuál es la diferencia entre la relación Composición y Asociación?
- 28. ¿cuál es la diferencia entre el material y la textura?
- 29. ¿Cuál es la diferencia entre el marco y la arquitectura?
- 30. ¿Cuál es la diferencia entre la carpeta vim72 y vimfiles?
gracias por su respuesta, llamada 'Application.Shutdown', pero el proceso todavía se está ejecutando no siempre sucedió, he intentado encontrar el hilo que se estaba ejecutando, pero este error no se volvió a producir ... –