/// <summary> /// Asynchronously processes all documents in the project in a comprehensive manner. /// </summary> /// <returns>A System.Threading.Tasks.Task representing the asynchronous processing operation.</returns> public async Task ParseDocuments() { var resourceLoadingNotifier = new ResourceNotifier(); var analysisOrchestrator = new AnalysisOrchestrator(FileManager.TxtFiles); var loadingEvents = ConfigureLoadingEvents(resourceLoadingNotifier); var loadedEvents = ConfigureLoadedEventStream(resourceLoadingNotifier); var analysisUpdateEvents = ConfigureAnalysisUpdateEvents(analysisOrchestrator); Observable.Merge( loadingEvents.Select(pattern => pattern.EventArgs), loadedEvents.Select(pattern => pattern.EventArgs), analysisUpdateEvents.Select(pattern => pattern.EventArgs) ) .Select(pattern => new { pattern.Message, Progress = pattern.PercentWorkRepresented }) .SubscribeOn(System.Threading.SynchronizationContext.Current) .Subscribe(onNext: async e => { progressLabel.Content = e.Message; progressBar.ToolTip = e.Message; var animateStep = 0.028 * e.Progress; for (var i = 0; i < 33; ++i) { progressBar.Value += animateStep; await Task.Yield(); } }); var timer = System.Diagnostics.Stopwatch.StartNew(); ResultsScreen.Documents = await analysisOrchestrator.ProcessAsync(); progressBar.Value = 100; var completetionMessage = $"Processing Complete. Time: {timer.ElapsedMilliseconds / 1000f} seconds"; progressLabel.Content = completetionMessage; progressBar.ToolTip = completetionMessage; proceedtoResultsButton.Visibility = Visibility.Visible; NativeMethods.StartFlashing(this); await Task.WhenAll(ResultsScreen.CreateWeightViewsForAllDocumentsAsync(), ResultsScreen.BuildTextViewsForAllDocumentsAsync()); ProcessingCompleted(this, new EventArgs()); }