Как перезапустить приложение WPF?


как перезапустить приложение WPF? В windows Forms я использовал

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

Как это сделать в WPF?

7 65

7 ответов:

Я нашел это: Это работает. Но. Есть ли лучший способ?

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

я использовал это в WPF, успешно:

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

или

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

в моей программе у меня есть мьютекс, чтобы гарантировать, что только один экземпляр приложения, запущенного на компьютере. Это приводило к тому, что недавно запущенное приложение не запускалось, потому что мьютекс не был выпущен своевременно. В результате я помещаю значение в свойства.Параметры, указывающие на перезапуск приложения. Перед вызовом приложения.Перезапустите() свойства.Значение настроек имеет значение true. в программах.Main() я также добавил чек для это специфическое свойство.значение настроек так, что при true он сбрасывается на false и есть поток.Сон(3000);

в вашей программе может быть логика:

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

В Программе.Главная()

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

вот и все.

запускает новый экземпляр программы с помощью командной строки после 1 секунды задержки. Во время задержки текущего завершения работы экземпляра.

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();
Application.Current.Shutdown();
System.Windows.Forms.Application.Restart();

в этом порядке работал для меня, наоборот, просто начал другой экземпляр приложения.

эти предлагаемые решения могут работать, но, как уже упоминал другой комментатор, они чувствуют себя как быстрый Хак. Другой способ сделать это, который чувствует себя немного чище, - запустить пакетный файл, который включает в себя задержку (например, 5 секунд), чтобы дождаться завершения текущего (закрытия) приложения.

это предотвращает одновременное открытие двух экземпляров приложения. В моем случае недопустимо, чтобы два экземпляра приложения были открыты одновременно - я использую мьютекс чтобы убедиться, что открыто только одно приложение - из-за приложения, использующего некоторые аппаратные ресурсы.

пример пакетного файла windows ("перезагрузка.летучая мышь"):

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

и в приложении WPF добавьте этот код:

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

// Close the current application
Application.Current.MainWindow.Close();
 Application.Restart();
 Process.GetCurrentProcess().Kill();

работать как шарм для меня