c# - net - Garantizar la ejecución del código incluso en proceso de muerte
remarks c# (4)
Necesito ejecutar una parte del código (el estado guardado) en el proceso de detención: por sí mismo, por usuario, por administrador de tareas, etc.
¿Es posible?
try {} finally {}
, AppDomain.ProcessExit
, IDisposable
, destructor, ... ¿qué sigue a continuación?
Como otros lo han señalado, no hay forma de ejecutar ningún código en su aplicación cuando el Operating System
o el User
. Por eso se llama Killing
.
Si guardar el estado es una parte importante de su aplicación, debe adoptar un enfoque similar al de un sistema de base de datos. Implementar el transaction log
, crear checkpoints
, etc. Eso es lo más cercano que puede obtener.
En ese caso, cuando la aplicación revive (se vuelve a ejecutar después de killed
), puede revisar estos transaction logs
para ver si hay actualizaciones pendientes o cambios de último estado.
Aparte de eso, realmente depende de lo que quieras hacer. ¿Y también por qué se te ocurrió esta idea? ¿Podemos obtener más detalles? Puede ser que alguien aquí tenga mejor alternativa.
Debe pensar por qué su programa está saliendo. Si es debido a un error, entonces puede usar try / catch. En términos de Unix, lo que sucede cuando el administrador de procesos detiene un proceso es una muerte (es decir, envía una señal SIGKILL) que no permite que el programa haga nada antes de salir del proceso. Lo que muchos virus hacen es tener dos procesos (posiblemente con memoria compartida para evitar la sincronización constante de datos), cada uno monitoreando el estado del otro y cuando uno se apaga, el otro reaparece. Quizás un segundo proceso podría monitorear y guardar el estado de una manera similar para su caso. El otro tipo de señal es un SIGTERM. Esta señal se envía cuando le dice a su computadora que se reinicie, pero hay procesos en ejecución. El kernel permite que los programas intenten salir por su cuenta, pero eventualmente le preguntarán al usuario si está bien matar el programa. Si desea manejar las señales de manejo de búsqueda SIGTERM. En última instancia, la única solución que conozco de SIGKILL es la solución de dos procesos.
El punto central de un proceso de muerte sin gracia es que simplemente detiene lo que está haciendo. Realmente no puedo ver una manera de evitar eso.
Estaba buscando por una razón algo diferente a la que está publicada, pero se me ocurrió una solución bastante buena para mí y podría ser útil decir aquí:
NOTA: para aquellos que saben lo que es, este es esencialmente el patrón de diseño ''Heartbeat''.
1) Además del código en ejecución que ''morirá'' (es decir, se eliminará), agregue código a este proyecto de manera que genere un hilo (¿o posiblemente otro método?) En la inicialización, y todo el hilo hace que se ejecute nunca finaliza el ciclo while (pero asegúrese de que duerma al menos unos segundos o incluso 1 minuto entre iteraciones) y en el ciclo while, grabe un indicador para indicar que su aplicación está "viva" (es decir, el "latido"). Personalmente recomiendo establecer un valor en la base de datos, o quizás en un archivo, que es la marca de tiempo actual (es decir, DateTime.Now)
2) Ahora que está grabando el ''latido'', cree otra aplicación (es decir, otro proceso) que no haga nada más que leer el valor del latido del corazón (es decir, la marca de tiempo actual) y lo haga en un bucle interminable. Una vez que se determina que el valor del latido del corazón es "malo" (es decir, tal vez si, por ejemplo, HeartBeatTimestamp + 5 min <DateTime.Now), ahora puede ejecutar su código que desea ejecutar "una vez que se termina el proceso"
Espero que esto te ayude :) Siéntete libre de investigar el patrón de diseño ''Heartbeat'' desde otros recursos si quieres saber más.
Aclamaciones,
Jeff