fix infinite loop when pressed ctrl+c

This commit is contained in:
cs8425
2026-04-28 21:09:14 +08:00
parent 3eca16a661
commit 34b93ad55d
3 changed files with 49 additions and 19 deletions

View File

@@ -160,7 +160,7 @@ public class LoaderManager : MikuSB
}
}
public static void InitCommand()
public static async Task InitCommand(CancellationToken exitToken)
{
// Register the command handlers
try
@@ -178,6 +178,6 @@ public class LoaderManager : MikuSB
IConsole.OnConsoleExcuteCommand += CommandExecutor.ConsoleExcuteCommand;
CommandExecutor.OnRunCommand += (sender, e) => { CommandManager.HandleCommand(e, sender); };
IConsole.ListenConsole();
await IConsole.ListenConsole(exitToken);
}
}

View File

@@ -18,6 +18,10 @@ public class MikuSB
public static readonly Listener Listener = new();
public static readonly CommandManager CommandManager = new();
// for exit signal
private static readonly CancellationTokenSource _cts = new();
private static int _exitCode = 0;
public static async Task Main()
{
var time = DateTime.Now;
@@ -50,44 +54,54 @@ public class MikuSB
ResourceManager.IsLoaded = true;
HandbookGenerator.GenerateAll();
LoaderManager.InitCommand();
var consoleTask = Task.Run(() => LoaderManager.InitCommand(_cts.Token), _cts.Token);
var elapsed = DateTime.Now - time;
Logger.Info(I18NManager.Translate("Server.ServerInfo.ServerStarted",
Math.Round(elapsed.TotalSeconds, 2).ToString(CultureInfo.InvariantCulture)));
await consoleTask;
ProcessExit(Volatile.Read(ref _exitCode));
}
# region Exit
#region Exit
private static void RegisterExitEvent()
{
AppDomain.CurrentDomain.ProcessExit += (_, _) =>
{
Logger.Info(I18NManager.Translate("Server.ServerInfo.Shutdown"));
ProcessExit();
RequestShutdown(0);
};
AppDomain.CurrentDomain.UnhandledException += (obj, arg) =>
{
Logger.Error(I18NManager.Translate("Server.ServerInfo.UnhandledException", obj.GetType().Name),
(Exception)arg.ExceptionObject);
Logger.Info(I18NManager.Translate("Server.ServerInfo.Shutdown"));
ProcessExit();
Environment.Exit(1);
RequestShutdown(1);
};
Console.CancelKeyPress += (_, eventArgs) =>
{
Logger.Info(I18NManager.Translate("Server.ServerInfo.CancelKeyPressed"));
eventArgs.Cancel = true;
Environment.Exit(0);
RequestShutdown(0);
};
}
private static void ProcessExit()
private static void RequestShutdown(int exitCode)
{
Interlocked.Exchange(ref _exitCode, exitCode);
_cts.Cancel();
}
private static void ProcessExit(int exitCode)
{
SocketListener.Connections.Values.ToList().ForEach(x => x.Stop(true));
DatabaseHelper.SaveThread?.Interrupt();
DatabaseHelper.SaveDatabase();
Environment.Exit(exitCode);
}
# endregion