Pregunta ¿Cómo reinicio una aplicación WPF?


¿Cómo puedo reiniciar una aplicación WPF? En Windows Forms utilicé

System.Windows.Forms.Application.Restart();

¿Cómo hacerlo en WPF?


65
2018-01-23 11:50


origen


Respuestas:


Encontré esto: Funciona. Pero. ¿Hay alguna forma mejor?

System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);
Application.Current.Shutdown();

77
2018-01-23 11:52



Lo he usado en WPF, con éxito:

System.Windows.Forms.Application.Restart();
System.Windows.Application.Current.Shutdown();

33
2018-03-10 21:15



Application.Restart();

o

System.Diagnostics.Process.Start(Application.ExecutablePath);
Application.Exit();

En mi programa, tengo un mutex para asegurar que solo una instancia de la aplicación se ejecute en una computadora. Esto estaba causando que la aplicación recién iniciada no se iniciara porque el mutex no se había lanzado de manera oportuna. Como resultado, pongo un valor en Properties.Settings que indica que la aplicación se está reiniciando. Antes de llamar a Application.Restart (), el valor de Properties.Settings se establece en verdadero. En Program.Main () también agregué un cheque para ese valor específico property.settings para que cuando true se restablezca a falso y haya un Thread.Sleep (3000);

En tu programa, puedes tener la lógica:

if (ShouldRestartApp)
{
   Properties.Settings.Default.IsRestarting = true;
   Properties.Settings.Default.Save();
   Application.Restart();
}

En Program.Main ()

[STAThread]
static void Main()
{
   Mutex runOnce = null;

   if (Properties.Settings.Default.IsRestarting)
   {
      Properties.Settings.Default.IsRestarting = false;
      Properties.Settings.Default.Save();
      Thread.Sleep(3000);
   }

   try
   {
      runOnce = new Mutex(true, "SOME_MUTEX_NAME");

      if (runOnce.WaitOne(TimeSpan.Zero))
      {
         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         Application.Run(new Form1());
      }
   }
   finally
   {
      if (null != runOnce)
         runOnce.Close();
   }
}

Eso es.


10
2017-09-04 11:36



Application.Current.Shutdown();
System.Windows.Forms.Application.Restart();

En este orden funcionó para mí, al revés comenzó otra instancia de la aplicación.


6
2018-05-29 18:42



Ejecuta una nueva instancia del programa por línea de comando después de 1 segundo de retraso. Durante el retraso el cierre de la instancia actual.

ProcessStartInfo Info = new ProcessStartInfo();
Info.Arguments = "/C choice /C Y /N /D Y /T 1 & START \"\" \"" + Assembly.GetExecutingAssembly().Location + "\"";
Info.WindowStyle = ProcessWindowStyle.Hidden;
Info.CreateNoWindow = true;
Info.FileName = "cmd.exe";
Process.Start(Info);
Application.Current.Shutdown();

6
2018-06-10 20:10



Estas soluciones propuestas pueden funcionar, pero como ha mencionado otro comentarista, se sienten como un truco rápido. Otra forma de hacer esto que se siente un poco más limpia es ejecutar un archivo por lotes que incluya un retraso (por ejemplo, 5 segundos) para esperar a que finalice la aplicación actual (cierre).

Esto evita que las dos instancias de aplicación se abran al mismo tiempo. En mi caso, no es válido para que dos instancias de aplicación se abran al mismo tiempo. Estoy usando un mutex para asegurar que solo haya una aplicación abierta, debido a que la aplicación usa algunos recursos de hardware.

Ejemplo de archivo por lotes de windows ("restart.bat"):

sleep 5
start "" "C:\Dev\MyApplication.exe"

Y en la aplicación WPF, agregue este código:

// Launch the restart batch file
Process.Start(@"C:\Dev\restart.bat");

// Close the current application
Application.Current.MainWindow.Close();

2
2018-05-15 02:14



 Application.Restart();
 Process.GetCurrentProcess().Kill();

trabaja como un encanto para mí


0
2018-05-09 07:59