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

View file

@ -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
//};
}
}
}
}