private void Analyze(DumpFileInfo dumpFileInfo) { int maxRetryCount = 5; int retryCount = 0; TimeSpan pauseBetweenAttempts = TimeSpan.FromSeconds(5); bool success = false; while (retryCount < maxRetryCount && !success) { try { Logger.PrintTrace($"Attempt {++retryCount}"); _defaultAnalysis.DumpFiles.Clear(); _defaultAnalysis.AddDumpFile(dumpFileInfo.FilePath); _defaultAnalysis.ReportPath = dumpFileInfo.FilePath + ".mht"; _defaultAnalysis.Symbols = DumpAnalyzerConfig.PublicSymbols; if (!string.IsNullOrEmpty(DumpAnalyzerConfig.RelativeSymbolsDirectory)) { _defaultAnalysis.Symbols += $";{GetRelativeSymbolsPath(dumpFileInfo)}"; } _dumpAnalyzer.RunAnalysis(_defaultAnalysis); success = true; } catch (FileLoadException ex) { Logger.ReportError($"error with reading the file {ex.FileName} - reetry again in {pauseBetweenAttempts}"); Logger.PrintError(ex); Thread.Sleep(pauseBetweenAttempts); } } }
static void Main(string[] args) { _av = new ArgsValidator(args); if (!_av.ValidArguments) { return; } _analysis = _av.GetAnalysisJob; var analyzer = new DumpAnalyzer(); if (!string.IsNullOrEmpty(_analysis.MonitoredFolder)) { Logger.PrintTrace("--------- Automatic Dump Analyzer ---------"); Logger.PrintTrace($"Monitoring {_analysis.MonitoredFolder} for dump files"); var priorites = Enum.GetNames(typeof(DumpPriority)).Length; var dumpsCollection = new BlockingCollection <DumpFileInfo>(new ConcurrentPriorityQueue <int, DumpFileInfo>(x => priorites - (int)x.Priority)); var consumer = new DumpFileConsumer(dumpsCollection, _analysis); var watcher = new DumpFileWatcher(_analysis.MonitoredFolder, dumpsCollection); var cts = new CancellationTokenSource(); Console.CancelKeyPress += (sender, eventArgs) => cts.Cancel(); consumer.Start(cts.Token); } else { analyzer.RunAnalysis(_analysis); } }