public async void OnReload() { var solutions = new HashSet <Solution> (); Task task = Task.CompletedTask; using (ProgressMonitor m = IdeApp.Workbench.ProgressMonitors.GetProjectLoadProgressMonitor(true)) { m.BeginTask(null, CurrentNodes.Length); foreach (ITreeNavigator node in CurrentNodes) { UnknownSolutionItem entry = (UnknownSolutionItem)node.DataItem; if (!entry.Enabled) { entry.Enabled = true; solutions.Add(entry.ParentSolution); } var am = m.BeginAsyncStep(1); var t = entry.ParentFolder.ReloadItem(am, entry).ContinueWith(ta => { am.Dispose(); }); task = Task.WhenAll(task, t); } m.EndTask(); } await task; await IdeApp.ProjectOperations.SaveAsync(solutions); }
internal static async Task <BuildResult> RunParallelBuildOperation(ProgressMonitor monitor, ConfigurationSelector configuration, IEnumerable <SolutionItem> sortedItems, Func <ProgressMonitor, SolutionItem, Task <BuildResult> > buildAction, bool ignoreFailed) { List <SolutionItem> toBuild = new List <SolutionItem> (sortedItems); BuildResult cres = new BuildResult(); cres.BuildCount = 0; // Limit the number of concurrent builders to processors / 2 var slotScheduler = new TaskSlotScheduler(Environment.ProcessorCount / 2); // Create a dictionary with the status objects of all items var buildStatus = new Dictionary <SolutionItem, BuildStatus> (); foreach (var it in toBuild) { buildStatus.Add(it, new BuildStatus()); } // Start the build tasks for all itemsw foreach (var itemToBuild in toBuild) { if (monitor.CancellationToken.IsCancellationRequested) { break; } var item = itemToBuild; var myStatus = buildStatus [item]; var myMonitor = monitor.BeginAsyncStep(1); // Get a list of the status objects for all items on which this one depends var refStatus = item.GetReferencedItems(configuration).Select(it => { BuildStatus bs; buildStatus.TryGetValue(it, out bs); return(bs); }).Where(t => t != null).ToArray(); // Build the item when all its dependencies have been built var refTasks = refStatus.Select(bs => bs.Task); myStatus.Task = Task.WhenAll(refTasks).ContinueWith(async t => { if (!ignoreFailed && (refStatus.Any(bs => bs.Failed) || t.IsFaulted)) { myStatus.Failed = true; } else { using (await slotScheduler.GetTaskSlot()) myStatus.Result = await buildAction(myMonitor, item); myStatus.Failed = myStatus.Result != null && myStatus.Result.ErrorCount > 0; } myMonitor.Dispose(); }, Runtime.MainTaskScheduler).Unwrap(); if (!Runtime.Preferences.ParallelBuild.Value) { await myStatus.Task; } } // Wait for all tasks to end await Task.WhenAll(buildStatus.Values.Select(bs => bs.Task)); // Generate the errors in the order they were supposed to build foreach (var it in toBuild) { BuildStatus bs; if (buildStatus.TryGetValue(it, out bs) && bs.Result != null) { cres.Append(bs.Result); } } return(cres); }