protected internal override void OnExecute(IProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration) { if (SingleStartup) { if (StartupItem == null) { monitor.ReportError(GettextCatalog.GetString("Startup item not set"), null); return; } StartupItem.Execute(monitor, context, configuration); } else { List <IAsyncOperation> list = new List <IAsyncOperation> (); monitor.BeginTask("Executing projects", 1); SynchronizedProgressMonitor syncMonitor = new SynchronizedProgressMonitor(monitor); foreach (SolutionEntityItem it in MultiStartupItems) { if (!it.CanExecute(context, configuration)) { continue; } AggregatedProgressMonitor mon = new AggregatedProgressMonitor(); mon.AddSlaveMonitor(syncMonitor, MonitorAction.ReportError | MonitorAction.ReportWarning | MonitorAction.SlaveCancel); list.Add(mon.AsyncOperation); SolutionEntityItem cit = it; Thread t = new Thread(delegate() { try { using (mon) { cit.Execute(mon, context, configuration); } } catch (Exception ex) { LoggingService.LogError("Project execution failed", ex); } }); t.Name = "Project execution"; t.IsBackground = true; t.Start(); } foreach (IAsyncOperation op in list) { op.WaitForCompleted(); } monitor.EndTask(); } }
/*protected virtual*/ async Task OnExecute(ProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration) { if (SingleStartup) { if (StartupItem == null) { monitor.ReportError(GettextCatalog.GetString("Startup item not set"), null); return; } await StartupItem.Execute(monitor, context, configuration); } else { var tasks = new List <Task> (); var monitors = new List <AggregatedProgressMonitor> (); monitor.BeginTask("Executing projects", 1); foreach (SolutionItem it in MultiStartupItems) { if (!it.CanExecute(context, configuration)) { continue; } AggregatedProgressMonitor mon = new AggregatedProgressMonitor(); mon.AddSlaveMonitor(monitor, MonitorAction.ReportError | MonitorAction.ReportWarning | MonitorAction.SlaveCancel); monitors.Add(mon); tasks.Add(it.Execute(mon, context, configuration)); } try { await Task.WhenAll(tasks); } catch (Exception ex) { LoggingService.LogError("Project execution failed", ex); } finally { foreach (var m in monitors) { m.Dispose(); } } monitor.EndTask(); } }