Merge pull request #21 from NoiTheCat/dev/graceful-shutdown

Better handling of program shutdown
This commit is contained in:
Noi 2023-06-24 16:08:35 -07:00 committed by GitHub
commit 2861b579b4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,7 +1,7 @@
namespace WorldTime;
class Program {
private static WorldTime? _bot;
private static WorldTime _bot = null!;
private static readonly DateTimeOffset _botStartTime = DateTimeOffset.UtcNow;
/// <summary>
@ -15,14 +15,15 @@ class Program {
cfg = new Configuration();
} catch (Exception ex) {
Console.WriteLine(ex);
Environment.Exit((int)ExitCodes.ConfigError);
Environment.Exit(2);
}
Console.CancelKeyPress += OnCancelKeyPressed;
_bot = new WorldTime(cfg);
await _bot.StartAsync().ConfigureAwait(false);
AppDomain.CurrentDomain.ProcessExit += OnCancelEvent;
Console.CancelKeyPress += OnCancelEvent;
await Task.Delay(-1).ConfigureAwait(false);
await _bot.StartAsync();
await Task.Delay(-1);
}
/// <summary>
@ -35,33 +36,19 @@ class Program {
Console.WriteLine($"{ts:s} [{source}] {item}");
}
private static void OnCancelKeyPressed(object? sender, ConsoleCancelEventArgs e) {
e.Cancel = true;
Log("Shutdown", "Captured cancel key; sending shutdown.");
ProgramStop();
}
private static bool _shutdownRequested = false;
private static void OnCancelEvent(object? sender, EventArgs e) {
if (e is ConsoleCancelEventArgs ce) ce.Cancel = true;
private static bool _stopping = false;
public static void ProgramStop() {
if (_stopping) return;
_stopping = true;
Log("Shutdown", "Commencing shutdown...");
if (_shutdownRequested) return;
_shutdownRequested = true;
Log("Shutdown", "Shutting down...");
var dispose = Task.Run(_bot!.Dispose);
if (!dispose.Wait(90000)) {
Log("Shutdown", "Normal shutdown has not concluded after 90 seconds. Will force quit.");
Environment.ExitCode &= (int)ExitCodes.ForcedExit;
var dispose = Task.Run(_bot.Dispose);
if (!dispose.Wait(15000)) {
Log("Shutdown", "Normal shutdown is taking too long. Will force quit.");
Environment.ExitCode = 1;
}
Environment.Exit(Environment.ExitCode);
}
[Flags]
public enum ExitCodes {
Normal = 0x0,
ForcedExit = 0x1,
ConfigError = 0x2,
DatabaseError = 0x4,
DeadShardThreshold = 0x8,
BadCommand = 0x10,
}
}