diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index 648ff9fc3..471525816 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -534,14 +534,7 @@ namespace MediaBrowser.ServerApplication Logger.ErrorException("Error sending server restart web socket message", ex); } - // Second instance will start first, so release the mutex and dispose the http server ahead of time - Application.Current.Dispatcher.Invoke(() => MainStartup.ReleaseMutex(Logger)); - - Dispose(); - - System.Windows.Forms.Application.Restart(); - - ShutdownInternal(); + MainStartup.Restart(); } /// @@ -661,15 +654,7 @@ namespace MediaBrowser.ServerApplication Logger.ErrorException("Error sending server shutdown web socket message", ex); } - ShutdownInternal(); - } - - public void ShutdownInternal() - { - Logger.Info("Shutting down application"); - var app = Application.Current; - - app.Dispatcher.Invoke(app.Shutdown); + MainStartup.Shutdown(); } /// diff --git a/MediaBrowser.ServerApplication/MainStartup.cs b/MediaBrowser.ServerApplication/MainStartup.cs index 2c11f8337..e9c1fdc99 100644 --- a/MediaBrowser.ServerApplication/MainStartup.cs +++ b/MediaBrowser.ServerApplication/MainStartup.cs @@ -27,6 +27,10 @@ namespace MediaBrowser.ServerApplication private static App _app; + private static BackgroundService _backgroundService; + + private static ILogger _logger; + /// /// Defines the entry point of the application. /// @@ -41,7 +45,7 @@ namespace MediaBrowser.ServerApplication var logManager = new NlogManager(appPaths.LogDirectoryPath, "server"); logManager.ReloadLogger(LogSeverity.Info); - var logger = logManager.GetLogger("Main"); + var logger = _logger = logManager.GetLogger("Main"); BeginLog(logger); @@ -187,6 +191,8 @@ namespace MediaBrowser.ServerApplication service.Disposed += service_Disposed; ServiceBase.Run(service); + + _backgroundService = service; } /// @@ -294,10 +300,10 @@ namespace MediaBrowser.ServerApplication /// The instance containing the event data. static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) { - // Try to shutdown gracefully - var task = _appHost.Shutdown(); - - Task.WaitAll(task); + if (e.Reason == SessionEndReasons.SystemShutdown || _backgroundService == null) + { + Shutdown(); + } } /// @@ -309,7 +315,10 @@ namespace MediaBrowser.ServerApplication { var exception = (Exception)e.ExceptionObject; - _app.OnUnhandledException(exception); + if (_backgroundService == null) + { + _app.OnUnhandledException(exception); + } if (!Debugger.IsAttached) { @@ -365,5 +374,44 @@ namespace MediaBrowser.ServerApplication return false; } + + public static void Shutdown() + { + if (_backgroundService != null) + { + _backgroundService.Stop(); + } + else + { + _app.Dispatcher.Invoke(_app.Shutdown); + } + } + + public static void Restart() + { + // Second instance will start first, so release the mutex and dispose the http server ahead of time + _app.Dispatcher.Invoke(() => ReleaseMutex(_logger)); + + _appHost.Dispose(); + + RestartInternal(); + + _app.Dispatcher.Invoke(_app.Shutdown); + } + + private static void RestartInternal() + { + if (_backgroundService == null) + { + System.Windows.Forms.Application.Restart(); + } + else + { + //var controller = new ServiceController() + //{ + // ServiceName = BackgroundService.Name + //}; + } + } } }