39 votes

Comment redémarrer une application WPF?

Comment puis-je redémarrer une application WPF? Dans Windows Forms j'ai utilisé

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

Comment le faire dans WPF?

43voto

Hooch Points 3444

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

19voto

epalm Points 911

J'ai utilisé cela dans WPF, avec succès:

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

5voto

Pascalsz Points 168
Application.Restart();

ou

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

Dans mon programme j'ai un mutex pour s'assurer qu'une seule instance de l'application en cours d'exécution sur un ordinateur. Cela a été l'origine de la nouvelle a commencé demande de ne pas démarrer car le mutex n'avait pas été communiqué en temps opportun. Par conséquent, j'ai mis une valeur dans les Propriétés.Les paramètres qui indique que l'application est en train de redémarrer. Avant d'appeler l'Application.Restart() les Propriétés.Paramètres valeur est définie sur true. Dans Programme.Main() j'ai aussi ajouté une vérification de cette propriété spécifique.les paramètres de valeur de sorte que quand il est vrai reset pour faux et il y a un Fil.Sleep(3000);

Dans votre programme, vous pourriez avoir de la logique:

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

Dans Programme.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.

3voto

dodgy_coder Points 2778

Les solutions proposées peuvent travailler, mais comme un autre intervenant a mentionné, ils se sentent comme une sorte de rapide hack. Une autre façon de faire ce qui se sent un peu plus propre est d'exécuter un fichier de commandes qui comprend un retard (par exemple 5 secondes) d'attente pour le courant (de fermeture) de l'application se termine.

Cela empêche les deux instances de l'application de s'ouvrir en même temps. Dans mon cas, sa non valide pour les deux instances de l'application de être ouverts en même temps je suis en utilisant un mutex pour s'assurer qu'il existe une seule application, ouvrez - en raison de l'application à l'aide de certaines ressources matérielles.

Exemple de fichier de commandes windows ("redémarrer.chauve-souris"):

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

0voto

abrfra Points 76
  Application.Restart();
 Process.GetCurrentProcess().Kill();
 

travailler comme un charme pour moi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: