Comment redémarrer une application WPF?

Comment redémarrer une application WPF? Dans Windows Forms j’ai utilisé

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

Comment le faire dans WPF?

J’ai trouvé ça: ça marche. Mais. Y a-t-il une meilleure façon?

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

Je l’ai utilisé avec succès dans WPF:

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

ou

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

Dans mon programme, j’ai un mutex pour assurer une seule instance de l’application en cours d’exécution sur un ordinateur. Cela provoquait le démarrage de l’application nouvellement démarrée car le mutex n’avait pas été publié en temps opportun. En conséquence, je mets une valeur dans Properties.Settings qui indique que l’application redémarre. Avant d’appeler Application.Restart (), la valeur Properties.Settings est définie sur true. Dans Program.Main (), j’ai également ajouté une vérification pour cette valeur spécifique de property.settings de sorte que, lorsqu’elle est vraie, elle soit réinitialisée à false et qu’il y ait un Thread.Sleep (3000);

Dans votre programme, vous pouvez avoir la logique:

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

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

C’est tout.

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

Dans cet ordre a fonctionné pour moi, l’inverse vient de démarrer une autre instance de l’application.

Exécute une nouvelle instance du programme par ligne de commande après un délai d’une seconde. Au cours de la temporisation de temporisation, arrêt de l’instance.

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

Ces solutions proposées peuvent fonctionner, mais comme un autre commentateur l’a mentionné, elles se sentent un peu comme un hack rapide. Une autre façon de procéder est de lancer un fichier de commandes qui inclut un délai (par exemple 5 secondes) pour attendre la fin de l’application (de fermeture) en cours.

Cela empêche les deux instances d’application d’être ouvertes en même temps. Dans mon cas, il est invalide que deux instances d’application soient ouvertes en même temps – j’utilise un mutex pour garantir l’ouverture d’une seule application – en raison de l’application utilisant certaines ressources matérielles.

Exemple de fichier batch Windows (“restart.bat”):

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

Et dans l’application WPF, ajoutez ce code:

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

travaille comme un charme pour moi