Exemple #1
0
        /// <summary>
        /// Executes the task.
        /// </summary>
        public Task <WorkUnitResult> ExecuteTask(TargetLoggingContext targetLoggingContext, BuildRequestEntry requestEntry, ITargetBuilderCallback targetBuilderCallback, ProjectTargetInstanceChild task, TaskExecutionMode mode, Lookup lookupForInference, Lookup lookupForExecution, CancellationToken cancellationToken)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                return(Task <WorkUnitResult> .FromResult(new WorkUnitResult(WorkUnitResultCode.Canceled, WorkUnitActionCode.Stop, null)));
            }

            ProjectOnErrorInstance errorTask = task as ProjectOnErrorInstance;

            if (null != errorTask)
            {
                ErrorTasks.Add(errorTask);
            }
            else
            {
                ProjectTaskInstance taskInstance = task as ProjectTaskInstance;
                ExecutedTasks.Add(taskInstance);

                if ((mode & TaskExecutionMode.InferOutputsOnly) == TaskExecutionMode.InferOutputsOnly)
                {
                    lookupForInference.AddNewItem(new ProjectItemInstance(requestEntry.RequestConfiguration.Project, taskInstance.Name + "_Item", "Item", task.Location.File));
                }
                else if ((mode & TaskExecutionMode.ExecuteTaskAndGatherOutputs) == TaskExecutionMode.ExecuteTaskAndGatherOutputs)
                {
                    lookupForExecution.AddNewItem(new ProjectItemInstance(requestEntry.RequestConfiguration.Project, taskInstance.Name + "_Item", "Item", task.Location.File));
                }

                if (String.Equals(taskInstance.Name, "CallTarget", StringComparison.OrdinalIgnoreCase))
                {
                    taskInstance.GetParameter("Targets");
                    char[] splitter = new char[] { ';' };
                    targetBuilderCallback.LegacyCallTarget(taskInstance.GetParameter("Targets").Split(splitter), false, taskInstance.Location);
                }

                _taskNumber++;
                if (FailTaskNumber == _taskNumber)
                {
                    if (taskInstance.ContinueOnError == "True")
                    {
                        return(Task <WorkUnitResult> .FromResult(new WorkUnitResult(WorkUnitResultCode.Failed, WorkUnitActionCode.Continue, null)));
                    }

                    return(Task <WorkUnitResult> .FromResult(new WorkUnitResult(WorkUnitResultCode.Failed, WorkUnitActionCode.Stop, null)));
                }
            }

            return(Task <WorkUnitResult> .FromResult(new WorkUnitResult(WorkUnitResultCode.Success, WorkUnitActionCode.Continue, null)));
        }
    public ExecutedTasks Execute(ICollection <Runnable> actions, TimeSpan timeout)
    {
        ExecutedTasks result        = new ExecutedTasks();
        List <Task>   continueTasks = new List <Task>();
        var           cts           = new CancellationTokenSource();

        cts.CancelAfter(timeout);
        var cancellationToken = cts.Token;

        foreach (var runnable in actions)
        {
            TaskCompletionSource <object> taskCompletionSource = new TaskCompletionSource <object>();
            Task task = taskCompletionSource.Task;

            //TODO Add missing logic here.

            var continueTask = task.ContinueWith(t => ContinuationFunction(t, runnable, result));
            continueTasks.Add(continueTask);
        }

        Task.WaitAll(continueTasks.ToArray());
        return(result);
    }
 private void ContinuationFunction(Task task, Runnable action, ExecutedTasks result)
 {
     //TODO add logic here.
 }