public static void FindReferences(Func <MSBuildReferenceCollector> createCollector, MSBuildRootDocument doc) { var monitor = IdeApp.Workbench.ProgressMonitors.GetSearchProgressMonitor(true, true); var tasks = new List <Task> (); foreach (var import in doc.GetDescendentImports()) { if (!import.IsResolved || !File.Exists(import.Filename)) { continue; } tasks.Add(Task.Run(() => { try { var xmlParser = new XmlParser(new XmlRootState(), true); var textDoc = TextEditorFactory.CreateNewDocument(import.Filename, MSBuildTextEditorExtension.MSBuildMimeType); xmlParser.Parse(textDoc.CreateReader()); var xdoc = xmlParser.Nodes.GetRoot(); FindReferences(createCollector(), monitor, import.Filename, xdoc, textDoc, doc); } catch (Exception ex) { monitor.ReportError($"Error searching file {Path.GetFileName (import.Filename)}", ex); LoggingService.LogError($"Error searching MSBuild file {import.Filename}", ex); } })); } tasks.Add(Task.Run(() => { try { var textDoc = TextEditorFactory.CreateNewDocument(doc.Text, doc.Filename, MSBuildTextEditorExtension.MSBuildMimeType); FindReferences(createCollector(), monitor, doc.Filename, doc.XDocument, textDoc, doc); } catch (Exception ex) { monitor.ReportError($"Error searching file {Path.GetFileName (doc.Filename)}", ex); LoggingService.LogError($"Error searching MSBuild file {doc.Filename}", ex); } })); Task.WhenAll(tasks).ContinueWith(t => monitor?.Dispose()); }