浏览代码

improve service shutdown

Luke Pulverenti 11 年之前
父节点
当前提交
d9fecd78a5
共有 2 个文件被更改,包括 56 次插入23 次删除
  1. 2 17
      MediaBrowser.ServerApplication/ApplicationHost.cs
  2. 54 6
      MediaBrowser.ServerApplication/MainStartup.cs

+ 2 - 17
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();
         }
 
         /// <summary>
@@ -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();
         }
 
         /// <summary>

+ 54 - 6
MediaBrowser.ServerApplication/MainStartup.cs

@@ -27,6 +27,10 @@ namespace MediaBrowser.ServerApplication
 
         private static App _app;
 
+        private static BackgroundService _backgroundService;
+
+        private static ILogger _logger;
+
         /// <summary>
         /// Defines the entry point of the application.
         /// </summary>
@@ -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;
         }
 
         /// <summary>
@@ -294,10 +300,10 @@ namespace MediaBrowser.ServerApplication
         /// <param name="e">The <see cref="SessionEndingEventArgs"/> instance containing the event data.</param>
         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();
+            }
         }
 
         /// <summary>
@@ -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
+                //};
+            }
+        }
     }
 }