Come posso riavviare un’applicazione WPF?

Come posso riavviare un’applicazione WPF? In Windows Forms ho usato

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

Come farlo in WPF?

Ho trovato questo: funziona. Ma. C’è un modo migliore?

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

Ho usato questo in WPF, con successo:

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

o

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

Nel mio programma ho un mutex per garantire solo una istanza dell’applicazione in esecuzione su un computer. Ciò stava causando l’avvio dell’applicazione non avviata poiché il mutex non era stato rilasciato in modo tempestivo. Di conseguenza, inserisco un valore in Properties.Settings che indica che l’applicazione si sta riavviando. Prima di chiamare Application.Restart (), il valore Properties.Settings è impostato su true. In Program.Main () ho anche aggiunto un controllo per quel valore property.settings specifico in modo che quando true viene reimpostato su false e vi è un Thread.Sleep (3000);

Nel tuo programma potresti avere la logica:

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

In 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(); } } 

Questo è tutto.

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

In questo ordine ha funzionato per me, il contrario ha appena iniziato un’altra istanza dell’app.

Esegue una nuova istanza del programma dalla riga di comando dopo 1 secondo di ritardo. Durante il ritardo, arresto dell’istanza corrente.

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

Queste soluzioni proposte potrebbero funzionare, ma come un altro commentatore ha menzionato, si sentono un po ‘come un attacco rapido. Un altro modo per fare ciò che sembra un po ‘più pulito è quello di eseguire un file batch che include un ritardo (ad esempio 5 secondi) per attendere la chiusura dell’applicazione corrente (in chiusura).

Ciò impedisce l’apertura simultanea delle due istanze dell’applicazione. Nel mio caso non è valido per due istanze dell’applicazione aperte contemporaneamente: sto utilizzando un mutex per garantire che sia aperta una sola applicazione, a causa dell’applicazione che utilizza alcune risorse hardware.

Esempio di file batch di Windows (“restart.bat”):

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

E nell’applicazione WPF, aggiungi questo codice:

 // Launch the restart batch file Process.Start(@"C:\Dev\restart.bat"); // Close the current application Application.Current.MainWindow.Close(); 
  Application.Restart(); Process.GetCurrentProcess().Kill(); 

lavoro come un fascino per me