Tengo una aplicación que realiza algunas tareas en segundo plano (escucha en la red & leyendo) en un Thread
por separado. Sin embargo, parece que el subproceso no se cierra/cancela cuando cierro la aplicación (haga clic en el botón "x" en la barra de título). ¿Eso es porque la rutina principal de subprocesos es while(true) {...}
? ¿Cuál es la solución aquí? Estaba buscando una bandera de "interrupción" para el subproceso como condición para el ciclo "while", pero no encontré ninguna.El hilo no se cierra al cerrar la aplicación
Respuesta
La manera más simple es establecer la propiedad IsBackground del hilo en verdadero. Esto evitará que mantenga la aplicación abierta. Una aplicación finaliza cuando finalizan todos los subprocesos que no son de fondo.
Una forma más controlada de detener el hilo es enviarle un mensaje para que se cierre de forma limpia y asegúrese de que ha finalizado antes de dejar que finalice el hilo principal.
Un método que no recomendaría es llamar al Thread.Abort
. Esto tiene una serie de problemas, uno de los cuales es que no se garantiza que termine el hilo. De la documentación:
Llamar a este método generalmente finaliza el hilo.
Énfasis mío.
Bueno, en lugar de while(true)
, tal vez usted debe:
while(appIsRunning)
{
}
Y, en el evento de cierre para su formulario,
appIsRunning = false;
thread.Join(2000);
donde la última línea es sólo para asegurarse de espera el hilo para terminar limpiamente Hay muchas otras formas de forzar el final de un hilo, pero el problema está ahí: no desea ser forzando cosas, quiere que sucedan lo más natural posible.
Después de la unión, puede verificar el estado de la secuencia para ver si ha finalizado. Si no lo hace, y luego (y solo en ese momento) forzar su finalización con un aborto, y tal vez notificar a su usuario (o escribir un registro) que algo no ha terminado como debería.
Sí, pero recuerda usar 'volatile' o' lock' u otro método de sincronización. –
@Mark: podría estar totalmente equivocado aquí, pero como el subproceso secundario solo lee y el subproceso principal solo escribe, ¿existe la posibilidad de un error? –
Sin sincronizar, no se garantiza que un cambio en appIsRunning de un hilo sea visible en el otro hilo. Puedes leer más aquí: http://timl.net/2009/03/volatile-memory.html –
Se podría mejorar la while (true) bucle para
void DoWork() {
while(!ShouldIQuitManualResetEvent.WaitOne(0)) {
// do something
}
IDidQuitManualResetEvent.Set()
}
Un poco más elegante, corta a partir de los nombres de los identificadores.
Siempre se puede forzar la situación:
class Program
{
public static void Main()
{
// ... do stuff
Environment.Exit(Environment.ExitCode);
}
}
El mejor enfoque consiste en establecer la propiedad Thread.IsBackground true como Mark ya se ha mencionado.
Usted puede comenzar su hilo como:
ThreadPool.QueueUserWorkItem(DoStuff, input)
y será abortar de forma automática con la aplicación de cerca.
- 1. Cómo detener un hilo cuando se cierra mi aplicación winform
- 2. ¿Se cierra un hilo automáticamente?
- 3. La aplicación WPF no se cierra correctamente
- 4. CLR se cierra cuando un hilo no se maneja. Excepción
- 5. zócalo no se cierra después de la aplicación se cierra si un proceso iniciado está abierto
- 6. ¿Se cierra automáticamente una SqlConnection cuando se cierra una aplicación?
- 7. Application.Current.Shutdown (-1) no cierra la aplicación WPF
- 8. Cerrar socket al finalizar la aplicación
- 9. Necesita saber cuándo se cierra la aplicación
- 10. WebSocket se cierra al enviar
- 11. Pregunta al usuario antes de cerrar la aplicación C# WPF
- 12. Al depurar una aplicación ASP.NET, ¿cómo finalizar la sesión de depuración cuando se cierra Firefox?
- 13. ResultSet no cerrado cuando se cierra la conexión?
- 14. El área de depuración se cierra en Xcode al ejecutar la aplicación
- 15. DialogResult que no cierra el formulario?
- 16. Cerrar la aplicación al presionar el botón Atrás en Android
- 17. Después de agregar el cuadro de diálogo no se cierra
- 18. WiX cierra la aplicación antes de la desinstalación - cierra las aplicaciones abiertas mensaje
- 19. Para cerrar la aplicación de formularios C#
- 20. ¿cómo se cierra una aplicación Silverlight de navegador?
- 21. ¿Por qué la ventana de pygame no se cierra correctamente?
- 22. C# Process.exited no se llama hasta que se cierra la ventana
- 23. El emulador no cierra Ubuntu
- 24. ¿Puedo detectar cuándo un subproceso en segundo plano es eliminado por la aplicación cuando se cierra la aplicación?
- 25. Cómo cerrar todos los ejecutores al salir de una aplicación?
- 26. El uso de MySQLConnection en C# no se cierra correctamente
- 27. Salir de la aplicación cuando NSWindow se cierra
- 28. Actividad reiniciada cuando se cierra la aplicación del controlador unexception
- 29. La aplicación se cierra en Froyo y Gingerbread
- 30. Ventana WPF que no se cierra
+1 al método del mensaje.'while (stayAlive)' en lugar de 'true' es mucho más limpio, incluso si toma algunos segundos extra para que el ciclo se solucione. – user7116