private static async Task Main(string[] args) { _logger = new Logger(); _logger.RegisterProvider(new ConsoleLogProvider()); _logger.RegisterProvider(new FileLogProvider()); AppDomain.CurrentDomain.ProcessExit += OnExit; Console.CancelKeyPress += OnExit; TaskScheduler.UnobservedTaskException += OnExit; var fileManager = new FileManager(_logger); var analysisEngine = new AnalysisEngine(_logger, fileManager); try { Parser.Default.ParseArguments <ArgOptions>(args) .WithParsed(async arg => { try { var inputFolder = arg.InputFolder; if (string.IsNullOrEmpty(inputFolder) || string.IsNullOrWhiteSpace(inputFolder)) { inputFolder = Environment.CurrentDirectory; } if (!Directory.Exists(inputFolder)) { await _logger.ErrorAsync($"Can't find valid directory at \"{inputFolder}\".", null); return; } arg.InputFolder = inputFolder; await _logger.InfoAsync("Start processing ..."); var stopwatch = Stopwatch.StartNew(); await analysisEngine.ExecuteAsync(arg); stopwatch.Stop(); await _logger.InfoAsync($"Process completed. It took {stopwatch.ElapsedMilliseconds}ms."); } catch (Exception ex) { await _logger.ErrorAsync("Unexpected interruption.", ex); } }) .WithNotParsed(async e => { foreach (var error in e) { await _logger.ErrorAsync($"Argument error: {error}", null); } }); } catch (Exception ex) { await _logger.ErrorAsync("Unexpected exception.", ex); } finally { await _logger.FlushAsync(); } }