improve service shutdown

This commit is contained in:
Luke Pulverenti 2013-09-21 17:00:12 -04:00
parent 4064b8bada
commit d9fecd78a5
2 changed files with 56 additions and 23 deletions

View File

@ -534,14 +534,7 @@ namespace MediaBrowser.ServerApplication
Logger.ErrorException("Error sending server restart web socket message", ex); 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 MainStartup.Restart();
Application.Current.Dispatcher.Invoke(() => MainStartup.ReleaseMutex(Logger));
Dispose();
System.Windows.Forms.Application.Restart();
ShutdownInternal();
} }
/// <summary> /// <summary>
@ -661,15 +654,7 @@ namespace MediaBrowser.ServerApplication
Logger.ErrorException("Error sending server shutdown web socket message", ex); Logger.ErrorException("Error sending server shutdown web socket message", ex);
} }
ShutdownInternal(); MainStartup.Shutdown();
}
public void ShutdownInternal()
{
Logger.Info("Shutting down application");
var app = Application.Current;
app.Dispatcher.Invoke(app.Shutdown);
} }
/// <summary> /// <summary>

View File

@ -27,6 +27,10 @@ namespace MediaBrowser.ServerApplication
private static App _app; private static App _app;
private static BackgroundService _backgroundService;
private static ILogger _logger;
/// <summary> /// <summary>
/// Defines the entry point of the application. /// Defines the entry point of the application.
/// </summary> /// </summary>
@ -41,7 +45,7 @@ namespace MediaBrowser.ServerApplication
var logManager = new NlogManager(appPaths.LogDirectoryPath, "server"); var logManager = new NlogManager(appPaths.LogDirectoryPath, "server");
logManager.ReloadLogger(LogSeverity.Info); logManager.ReloadLogger(LogSeverity.Info);
var logger = logManager.GetLogger("Main"); var logger = _logger = logManager.GetLogger("Main");
BeginLog(logger); BeginLog(logger);
@ -187,6 +191,8 @@ namespace MediaBrowser.ServerApplication
service.Disposed += service_Disposed; service.Disposed += service_Disposed;
ServiceBase.Run(service); ServiceBase.Run(service);
_backgroundService = service;
} }
/// <summary> /// <summary>
@ -294,10 +300,10 @@ namespace MediaBrowser.ServerApplication
/// <param name="e">The <see cref="SessionEndingEventArgs"/> instance containing the event data.</param> /// <param name="e">The <see cref="SessionEndingEventArgs"/> instance containing the event data.</param>
static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{ {
// Try to shutdown gracefully if (e.Reason == SessionEndReasons.SystemShutdown || _backgroundService == null)
var task = _appHost.Shutdown(); {
Shutdown();
Task.WaitAll(task); }
} }
/// <summary> /// <summary>
@ -309,7 +315,10 @@ namespace MediaBrowser.ServerApplication
{ {
var exception = (Exception)e.ExceptionObject; var exception = (Exception)e.ExceptionObject;
_app.OnUnhandledException(exception); if (_backgroundService == null)
{
_app.OnUnhandledException(exception);
}
if (!Debugger.IsAttached) if (!Debugger.IsAttached)
{ {
@ -365,5 +374,44 @@ namespace MediaBrowser.ServerApplication
return false; 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
//};
}
}
} }
} }