예제 #1
0
        /// <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());
        }