public Task LoadItemsAsync(Action cancelAction = null) { CancellationToken cancellationToken = progressNotifier.GetCanellationToken(); cancellationToken.Register(() => { if (cancelAction != null) { cancelAction(); } }); this.progressNotifier.IsBusy = true; this.progressNotifier.IsIndeterminate = false; this.progressNotifier.LoadingMessage = "Loading..."; var task = Task.Factory.StartNew(() => { try { int assemblyCount = TypesMap.OldType != null && TypesMap.NewType != null ? 2 : 1; int assemblyNumber = 1; if (TypesMap.OldType != null && !GlobalDecompilationResultsRepository.Instance.ContainsAssembly(TypesMap.OldType)) { progressNotifier.LoadingMessage = string.Format("Loading assembly {0} of {1}", assemblyNumber, assemblyCount); IAssemblyDecompilationResults r1 = Decompiler.GenerateFiles(TypesMap.OldType, GenerationProjectInfoMap.OldType.OutputPath, SupportedLanguage.CSharp, cancellationToken, progressNotifier); cancellationToken.ThrowIfCancellationRequested(); GlobalDecompilationResultsRepository.Instance.AddDecompilationResult(TypesMap.OldType, r1); TrackFrameworkVersionAndAssemblyType(TypesMap.OldType); assemblyNumber++; } if (TypesMap.NewType != null && !GlobalDecompilationResultsRepository.Instance.ContainsAssembly(TypesMap.NewType)) { progressNotifier.LoadingMessage = string.Format("Loading assembly {0} of {1}", assemblyNumber, assemblyCount); progressNotifier.Progress = 0; IAssemblyDecompilationResults r2 = Decompiler.GenerateFiles(TypesMap.NewType, GenerationProjectInfoMap.NewType.OutputPath, SupportedLanguage.CSharp, cancellationToken, progressNotifier); cancellationToken.ThrowIfCancellationRequested(); GlobalDecompilationResultsRepository.Instance.AddDecompilationResult(TypesMap.NewType, r2); TrackFrameworkVersionAndAssemblyType(TypesMap.NewType); } List <SharpTreeNode> moduleNodes = this.GetMergedModules(true).ToList(); this.differenceDecoration = this.GetDifferenceDecoration(moduleNodes); var defaultResourceNode = new DefaultResourceNode(TypesMap, this, this.GenerationProjectInfoMap, this.FilterSettings); DispatcherObjectExt.BeginInvoke(() => { cancellationToken.ThrowIfCancellationRequested(); foreach (ModuleNode node in moduleNodes) { this.Children.Add(node); } this.Children.Add(defaultResourceNode); this.OnChildrenLoaded(); this.progressNotifier.Completed(); }, DispatcherPriority.Background); } catch (Exception ex) { var exceptionStringBuilder = new StringBuilder(); exceptionStringBuilder.Append(ex.Message) .AppendLine() .AppendLine(ex.StackTrace); DispatcherObjectExt.BeginInvoke( () => { ToolWindow.ShowDialog(new ErrorMessageWindow(exceptionStringBuilder.ToString(), "Exception"), width: 800, height: 500); this.progressNotifier.Completed(); }, DispatcherPriority.Background); throw ex; } }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current); return(task); }