Как перезапустить приложение WPF? - PullRequest
72 голосов
/ 23 января 2011

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

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

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

Ответы [ 8 ]

90 голосов
/ 23 января 2011

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

System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);
Application.Current.Shutdown();
35 голосов
/ 11 марта 2011

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

System.Windows.Forms.Application.Restart();
System.Windows.Application.Current.Shutdown();
10 голосов
/ 04 сентября 2012
Application.Restart();

или

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

В моей программе есть мьютекс, обеспечивающий только один экземпляр приложения, работающего на компьютере. Это приводило к тому, что вновь запущенное приложение не запускалось, потому что мьютекс не был выпущен своевременно. В результате я поместил значение в Properties.Settings, которое указывает, что приложение перезапускается. Перед вызовом Application.Restart () значение Properties.Settings устанавливается в значение true. В Program.Main () я также добавил проверку для этого конкретного значения property.settings, чтобы при значении true оно сбрасывалось до false, и был Thread.Sleep (3000);

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

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

Вот и все.

9 голосов
/ 10 июня 2017

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

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

РЕДАКТИРОВАТЬ:

Я исправил код:

вместо: Assembly.GetExecutingAssembly().Location

this: Assembly.GetEntryAssembly().Location

Это важно, когда функция запускается в отдельной dll.

И -

вместо: Application.Current.Shutdown();

this: Process.GetCurrentProcess().Kill();

Это будет работать как в WinForms, так и в WPF, и если вы напишите dll, предназначенную для обоих, то это очень важно.

7 голосов
/ 29 мая 2015
Application.Current.Shutdown();
System.Windows.Forms.Application.Restart();

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

2 голосов
/ 15 мая 2012

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

Это предотвращает одновременное открытие двух экземпляров приложения.В моем случае недопустимо одновременное открытие двух экземпляров приложения - я использую мьютекс, чтобы гарантировать, что открыто только одно приложение - из-за приложения, использующего некоторые аппаратные ресурсы.file ("restart.bat"):

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();
1 голос
/ 09 мая 2014
 Application.Restart();
 Process.GetCurrentProcess().Kill();

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

0 голосов
/ 14 ноября 2018

Используя пример Хуча, я использовал следующее:

using System.Runtime.CompilerServices;

private void RestartMyApp([CallerMemberName] string callerName = "")
{
    Application.Current.Exit += (s, e) =>
    {
        const string allowedCallingMethod = "ButtonBase_OnClick"; // todo: Set your calling method here

        if (callerName == allowedCallingMethod)
        {
            Process.Start(Application.ResourceAssembly.Location);
        }
     };

     Application.Current.Shutdown(); // Environment.Exit(0); would also suffice 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...