diff --git a/src/Artemis.Core/Services/PluginService.cs b/src/Artemis.Core/Services/PluginService.cs index d8ce410a7..5001580b2 100644 --- a/src/Artemis.Core/Services/PluginService.cs +++ b/src/Artemis.Core/Services/PluginService.cs @@ -348,7 +348,7 @@ namespace Artemis.Core.Services // Device providers cannot be disabled at runtime, restart the application if (plugin is DeviceProvider) { - CurrentProcessUtilities.RestartSelf(); + CurrentProcessUtilities.Shutdown(2, true); return; } diff --git a/src/Artemis.Core/Utilities/CurrentProcessUtilities.cs b/src/Artemis.Core/Utilities/CurrentProcessUtilities.cs index a549c4b4f..729299de4 100644 --- a/src/Artemis.Core/Utilities/CurrentProcessUtilities.cs +++ b/src/Artemis.Core/Utilities/CurrentProcessUtilities.cs @@ -11,16 +11,24 @@ namespace Artemis.Core.Utilities return Process.GetCurrentProcess().MainModule.FileName; } - public static void RestartSelf() + public static void Shutdown(int delay, bool restart) { + // Always kill the process after the delay has passed, with all the plugins a graceful shutdown cannot be guaranteed + var arguments = "-Command \"& {Start-Sleep -s " + delay + "; (Get-Process 'Artemis.UI').kill()}"; + // If restart is required, start the executable again after the process was killed + if (restart) + arguments = "-Command \"& {Start-Sleep -s " + delay + "; (Get-Process 'Artemis.UI').kill(); Start-Process -FilePath '" + GetCurrentLocation() + "'}\""; + var info = new ProcessStartInfo { - Arguments = "/C choice /C Y /N /D Y /T 5 & START /wait taskkill /f /im \"Artemis.UI.exe\" & START \"\" \"" + GetCurrentLocation() + "\"", - WindowStyle = ProcessWindowStyle.Hidden, - CreateNoWindow = true, - FileName = "cmd.exe" + Arguments = arguments, + WindowStyle = ProcessWindowStyle.Hidden, + CreateNoWindow = true, + FileName = "PowerShell.exe" }; Process.Start(info); + + // Also attempt a graceful shutdown on the UI thread Execute.OnUIThread(() => Application.Current.Shutdown()); } } diff --git a/src/Artemis.UI/Screens/TrayViewModel.cs b/src/Artemis.UI/Screens/TrayViewModel.cs index 8ff99eb65..818458204 100644 --- a/src/Artemis.UI/Screens/TrayViewModel.cs +++ b/src/Artemis.UI/Screens/TrayViewModel.cs @@ -1,6 +1,7 @@ using System.Windows; using Artemis.Core.Services; using Artemis.Core.Services.Interfaces; +using Artemis.Core.Utilities; using Artemis.UI.Events; using Artemis.UI.Screens.Splash; using Ninject; @@ -57,7 +58,7 @@ namespace Artemis.UI.Screens public void TrayExit() { - Application.Current.Shutdown(); + CurrentProcessUtilities.Shutdown(2, false); } private void ShowSplashScreen()