public string[] GetAvailableProjects() { Debug.Assert(_solutionManager != null); return(NuGetUIThreadHelper.JoinableTaskFactory.Run(async delegate { var displayNames = new List <string>(); var displayNameTasks = new List <Task <string> >(); // start a single task to get all project's safe name var safeNamesTask = Task.Run(async() => await _solutionManager.GetAllNuGetProjectSafeNameAsync()); var allProjects = await _solutionManager.GetNuGetProjectsAsync(); foreach (var project in allProjects) { // Throttle and wait for a task to finish if we have hit the limit if (displayNameTasks.Count == MaxTasks) { var displayName = await CompleteTaskAsync(displayNameTasks); displayNames.Add(displayName); } var displayNameTask = Task.Run(async() => await GetDisplayNameAsync(project)); displayNameTasks.Add(displayNameTask); } // wait until all the tasks to retrieve display names are completed while (displayNameTasks.Count > 0) { var displayName = await CompleteTaskAsync(displayNameTasks); displayNames.Add(displayName); } _projectSafeNames = (await safeNamesTask).ToArray(); Array.Sort(displayNames.ToArray(), _projectSafeNames, StringComparer.CurrentCultureIgnoreCase); return _projectSafeNames; })); }