private static void Mode(string modeName, string baseConfigFilename, string modeConfigFilename) { BaseConfig baseConfig = ReadConfig <BaseConfig>(baseConfigFilename); using ILoggerFactory loggerFactory = BuildLoggerFactory(baseConfig); ILogger logger = loggerFactory.CreateLogger("main"); IMode mode = modeName switch { "run" => new Runmode(loggerFactory, baseConfig, ReadConfig <RunmodeConfig>(modeConfigFilename)), "match" => new Matchmode(loggerFactory, baseConfig, ReadConfig <MatchmodeConfig>(modeConfigFilename)), "dualcore" => new DualcoreMode(loggerFactory, baseConfig), "dummy" => new DummyMode(loggerFactory, baseConfig), _ => throw new NotSupportedException($"Invalid mode '{modeName}'") }; try { Task modeTask = mode.Run(); void Abort(object?sender, EventArgs args) { logger.LogInformation("Aborting mode..."); mode.Cancel(); modeTask.Wait(); } AppDomain.CurrentDomain.ProcessExit += Abort; // SIGTERM Console.CancelKeyPress += Abort; // CTRL-C / SIGINT modeTask.Wait(); } catch (Exception ex) { logger.LogCritical(ex, "uncaught exception! TPP is crashing now, goodbye."); } }