private static (Task task, FmShell.Shell shell) StartShell(ServerConfiguration serverConfig, ServerInfo serverInfo, ServerController serverController, RadioCastServer radioCastServer) { LOGGER.Info("Starting Shell..."); var shell = new FmShell.Shell(new ShellMethods(serverInfo, serverController, radioCastServer), serverConfig.ConsolePrompt, "FindFM", ConsoleColor.Black, ConsoleColor.Green); var shellTask = new Task(() => shell.Start()); shellTask.Start(); return(shellTask, shell); }
private static async Task AwaitTermination(Task shellTask, FmShell.Shell shell, Task hostTask, IWebHost host, Task radioFeeder) { Task.WaitAny(shellTask, hostTask, radioFeeder); if (shellTask.IsCompleted) { LOGGER.Info("Shell has been shutdown. Shutting down the Host as well. Timeout: 1 minute"); var beforeStop = DateTime.Now; await host.StopAsync(TimeSpan.FromMinutes(1)); var afterStop = DateTime.Now; LOGGER.Info("Host has been stopped. Time taken: {}", afterStop - beforeStop); if (shellTask.Exception?.InnerExceptions?.Count > 0) { throw shellTask.Exception; } } else if (hostTask.IsCompleted) { LOGGER.Info("Host has been shutdown. Shutting down the Shell as well."); shell.Stop(); LOGGER.Info("Shell has been stopped."); if (hostTask.Exception?.InnerExceptions?.Count > 0) { throw hostTask.Exception; } } else if (radioFeeder.IsCompleted) { LOGGER.Info("Radio has been shutdown. Shutting down server and shell as well."); await host.StopAsync(TimeSpan.FromMinutes(1)); shell.Stop(); if (radioFeeder.Exception?.InnerExceptions?.Count > 0) { throw radioFeeder.Exception; } } }