private static async Task <int> MainAsync(string[] arguments) { var signal = new AutoResetEvent(false); var input = arguments.Length > 0 ? arguments[0] : "redis"; arguments = arguments.Length > 0 ? arguments.Skip(1).ToArray() : arguments; if (!Commands.TryGetValue(input, out var type)) { Console.WriteLine($"Invalid command: {input}"); return(-1); } var command = (ICommand)Activator.CreateInstance(type); command.Done += (sender, args) => signal.Set(); OnExit.Register(() => signal.Set()); try { await command.Start(arguments); signal.WaitOne(); await command.Stop(); } catch (Exception exception) { Console.WriteLine(exception.Message); Console.WriteLine(exception.StackTrace); return(-1); } return(0); }