mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-13 03:00:25 +01:00
improve service shutdown
This commit is contained in:
@@ -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
|
||||
//};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user