public async override Task <ResultStatus> Execute(IExecuteContext executeContext, BuilderContext builderContext) { var buildStepsToWait = new List <BuildStep>(); while (true) { // interrupt the build if cancellation is required. if (executeContext.CancellationTokenSource.Token.IsCancellationRequested) { return(ResultStatus.Cancelled); } // Clean completed build steps for (int index = buildStepsToWait.Count - 1; index >= 0; index--) { var buildStepToWait = buildStepsToWait[index]; if (buildStepToWait.Processed) { buildStepsToWait.RemoveAt(index); } } // wait for a task to complete if (buildStepsToWait.Count >= MaxParallelSteps) { await CompleteOneBuildStep(executeContext, buildStepsToWait); } // Should we check for all tasks or only high priority tasks? (priority < 0) bool checkOnlyForHighPriorityTasks = buildStepsToWait.Count >= MaxParallelSteps; // Transform item into build step var buildStep = buildStepProvider.GetNextBuildStep(checkOnlyForHighPriorityTasks ? -1 : int.MaxValue); // No job => passively wait if (buildStep == null) { newWorkAvailable.WaitOne(); continue; } // Safeguard if the provided build step is already processed if (buildStep.Processed) { continue; } if (buildStep is WaitBuildStep) { throw new InvalidOperationException("WaitBuildStep are not supported as direct child of DynamicBuildStep"); } // Schedule build step executeContext.ScheduleBuildStep(buildStep); buildStepsToWait.Add(buildStep); } }
public async override Task <ResultStatus> Execute(IExecuteContext executeContext, BuilderContext builderContext) { var buildStepsToWait = new List <BuildStep>(); while (true) { // interrupt the build if cancellation is required. if (executeContext.CancellationTokenSource.Token.IsCancellationRequested) { return(ResultStatus.Cancelled); } // wait for a task to complete if (buildStepsToWait.Count >= MaxParallelism) { await CompleteOneBuildStep(executeContext, buildStepsToWait); } // Transform item into build step var buildStep = buildStepProvider.GetNextBuildStep(); // No job => passively wait if (buildStep == null) { newWorkAvailable.WaitOne(); continue; } // Safeguard if the provided build step is already processed if (buildStep.Processed) { continue; } if (buildStep is WaitBuildStep) { // wait for all the task in execution to complete while (buildStepsToWait.Count > 0) { await CompleteOneBuildStep(executeContext, buildStepsToWait); } continue; } // Schedule build step executeContext.ScheduleBuildStep(buildStep); buildStepsToWait.Add(buildStep); } }