El apagado limpio
Lo que hay que hacer entre que se pide salir y el proceso muere: parar las tareas, cerrar lo que esté abierto, escribir lo pendiente. Con un límite, y con el orden correcto.
El orden
El paso 2 es el que se olvida. El frontend puede tener estado que nunca cruzó el puente —un texto a medias, un formulario— y si nadie le avisa, se pierde sin que el core se entere de nada.
El código
tauri::RunEvent::ExitRequested { api, .. } => { if YA_APAGANDO.swap(true, Ordering::SeqCst) { return; } // solo una vez api.prevent_exit(); let app = app.clone(); tauri::async_runtime::spawn(async move { // 2 · avisar al frontend y darle un momento let _ = app.emit(eventos::VA_A_CERRAR, ()); tokio::time::sleep(Duration::from_millis(300)).await; // 3 y 4 · cancelar y esperar, con límite let manejadores = app.state::<Trabajos>().cancelar_todos(); let _ = tokio::time::timeout( Duration::from_secs(5), futures::future::join_all(manejadores), ).await; // 5 y 6 · escribir y cerrar if let Err(e) = guardar_pendiente(&app).await { log::error!("{e:?}"); } cerrar_recursos(&app); // 7 · ahora sí app.exit(0); });}Dos detalles que evitan fallos:
La bandera de «ya apagando». Sin ella, un segundo intento de salir mientras el apagado corre lanza el procedimiento otra vez, con dos apagados compitiendo. Y el usuario que ve que no se cierra vuelve a pulsar, así que ocurre.
El apagado va en una tarea, no en el manejador. Si estuviera en el manejador, el bucle se bloquearía durante los cinco segundos de espera y la aplicación parecería colgada justo al cerrarse — el caso 5 del nivel 24.3, en el peor momento.
El límite, y qué pasa al agotarse
Se sale igual. Es la conclusión del nivel 23.4 y aquí se aplica: una aplicación que no se cierra es peor que una que cierra abandonando una tarea, siempre que lo importante ya esté escrito.
Lo que sí hay que hacer es dejar constancia: registrar cuál no paró, con su identificador. Esa línea del registro es lo que dice mañana qué tarea tiene la comprobación demasiado gruesa.
Y un límite razonable: unos cinco segundos en total. Más que eso y el usuario cree que se ha colgado; menos y una tarea con una comprobación cada segundo no llega.
El apagado que no avisa
Hay que asumir que el procedimiento no siempre se ejecuta:
Las tres últimas filas dicen lo mismo y es la conclusión del nivel: el apagado limpio es una mejora, no una garantía. Lo que de verdad protege los datos del usuario es la política de escritura del nivel 22.5, y el apagado solo se encarga de lo poco que quede.
Si tu apagado tiene mucho que hacer, el problema no está en el apagado.