Saltar al contenido

¿Cómo reinicio mi aplicación C# WinForm?

Posterior a de nuestra larga búsqueda de información hemos podido resolver esta obstáculo que pueden tener ciertos usuarios. Te ofrecemos la solución y nuestro objetivo es serte de gran ayuda.

Solución:

Un enfoque mucho más simple que funcionó para mí es:

Application.Restart();
Environment.Exit(0);

Esto conserva los argumentos de la línea de comandos y funciona a pesar de los controladores de eventos que normalmente evitarían que la aplicación se cierre.

La llamada Restart() intenta salir, inicia una nueva instancia de todos modos y regresa. La llamada Exit() luego finaliza el proceso sin dar a ningún controlador de eventos la oportunidad de ejecutarse. Hay un período muy breve en el que ambos procesos se ejecutan, lo cual no es un problema en mi caso, pero tal vez en otros casos.

El código de salida 0 en Environment.Exit(0); especifica un apagado limpio. También puede salir con 1 para especificar que ocurrió un error.

Si está en el formulario de la aplicación principal, intente usar

System.Diagnostics.Process.Start( Application.ExecutablePath); // to start new instance of application
this.Close(); //to turn off current app

Desafortunadamente, no puede usar Process.Start() para iniciar una instancia del proceso que se está ejecutando actualmente. Según los documentos de Process.Start(): “Si el proceso ya se está ejecutando, no se inicia ningún recurso de proceso adicional…”

Esta técnica funcionará bien con el depurador de VS (porque VS hace algún tipo de magia que hace que Process.Start piense que el proceso aún no se está ejecutando), pero fallará cuando no se ejecute con el depurador. (Tenga en cuenta que esto puede ser específico del sistema operativo: creo recordar que en algunas de mis pruebas, funcionó en XP o Vista, pero es posible que solo recuerde haberlo ejecutado con el depurador).

Esta técnica es exactamente la que usó el último programador en el proyecto en el que estoy trabajando actualmente, y he estado tratando de encontrar una solución para esto durante bastante tiempo. Hasta ahora, solo he encontrado una solución, y me parece sucia y torpe: inicie una segunda aplicación, que espera en segundo plano a que finalice la primera aplicación, luego vuelve a iniciar la primera aplicación. Estoy seguro de que funcionaría, pero, ¡qué asco!

Editar: usar una segunda aplicación funciona. Todo lo que hice en la segunda aplicación fue:

    static void RestartApp(int pid, string applicationName )
    
        // Wait for the process to terminate
        Process process = null;
        try
        
            process = Process.GetProcessById(pid);
            process.WaitForExit(1000);
        
        catch (ArgumentException ex)
        
            // ArgumentException to indicate that the 
            // process doesn't exist?   LAME!!
        
        Process.Start(applicationName, "");
    

(Este es un ejemplo muy simplificado. El código real tiene muchas comprobaciones de cordura, manejo de errores, etc.)

Te mostramos reseñas y calificaciones

Si conservas alguna perplejidad y forma de aumentar nuestro división puedes añadir un comentario y con mucho gusto lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *