Tengo un formulario de Windows que crea múltiples aplicaciones de consola del mismo programa (que llama program.exe cualquier número de veces) usandomatar limpiamente una aplicación de consola desde el interior de un grupo de aplicaciones de consola
process.start().
soy buscando una forma de identificar un funcionamiento específico de la aplicación y matarla limpiamente (es decir, cerrar limpiamente el 5to proceso de program.exe pero dejar todos los otros procesos en ejecución). Soy capaz de identificar cada proceso diferente de program.exe través de las identificaciones que se dieron cuando se iniciaron los procesos, pero no soy capaz de cerrar la aplicación de cualquier otra manera que llamar
process.kill()
que no realiza un cierre limpio de la aplicación.
creo que no puedo usar
ya que la aplicación no tiene una ventana (que se ejecuta a través de una consola que se ejecuta en segundo plano). Estoy buscando eliminar los procesos haciendo clic en un botón en mi GUI después de seleccionar el proceso que se eliminará de una lista de los procesos que se están ejecutando.
La razón por la que necesito esto es porque necesito cerrar todos los hilos y aspectos pendientes de cada proceso antes de que se cierre.
defino cada nuevo proceso de la siguiente manera,
Process process = new Process();
process.StartInfo = info;
ExecutionDetails details = new ExecutionDetails(run_id, process, info, session_type, strategy_type, name, ExecutionViewModel);
lock (_runs)
_runs.Add(run_id, details); // will throw on Add if duplicate id, prevent duplicate
ExecutionViewModel.NewRun(details); // add to the view model
process.Start();
Dónde run_id es un GUID que identifica a cada proceso.
En una clase separada, tengo el código que se ejecuta a través del proceso al que solo se hace referencia mediante el símbolo del sistema que inicia el programa (es decir, llama al programa, proporciona variables de configuración, etc.).
¿Hay alguna manera de que pueda cerrar los procesos limpiamente? Estaba pensando que tener un evento que se llama cuando quiero matar el proceso podría funcionar, pero hasta ahora no he podido hacer que funcione esa idea, ya que no puedo especificar qué proceso quiero cerrar.
** EDITAR - Mi código para el manejo de eventos que he intentado implementar pero que no está funcionando.
código Ventana principal
public void KillOne() {
foreach (var details in _runs.Values) {
if(details.IsSelected) {
StrategyStateManager.SessionClosed(this, details.RunId);
} } }
Código de StrategyStateManager (Clase media se utiliza para mantener las variables y eventos para utilizar en el programa)
public delegate void StrategyCloseEventHandler(object sender, StrategyCloseEventArgs e);
public static void SessionClosed(object sender, Guid id)
{
if(CloseSession != null)
CloseSession(sender, new StrategyCloseEventArgs(id));
}
public class StrategyCloseEventArgs : EventArgs
{
private readonly Guid id;
public StrategyCloseEventArgs(Guid run_id)
{
id = run_id;
}
public Guid GetRunID()
{
return id;
}
}
Código de proceso que se inició por la ventana principal
StrategyStateManager.CloseSession += (closeStrategy);
void closeStrategy(object sender, StrategyCloseEventArgs e)
{
if (e.GetRunID() == run_id)
{
strategy.cleanupForShutdown();
DBSaverSimple.shutdownAll();
logger.Warn("Simulation run stopped by user");
}
}
I implimented la Idea EventWaitHandle que sugirió y funcionó muy bien. Gracias – jwb555
¿Downuidor? Es costumbre proporcionar un comentario que proporcione una razón para el voto a la baja. –