/// <summary> /// Check if all child jobs are finished; if so, mark this job as finished. /// </summary> private void OnChildJobStateChanged(object?sender, EventArgs?arguments) { if (JobStateInfo.State == JobState.NotStarted || JobStateInfo.State == JobState.Suspended) { SetJobState(JobState.Running); } if (_jobMode == TaskJobMode.Consecutive || _jobMode == TaskJobMode.ConsecutiveStopAtFailure) { // if no jobs are running, start the next queued job if (ChildJobs.All(j => j.IsFinished() || j.JobStateInfo.State == JobState.NotStarted)) { if (_queue != null) { if (_jobMode == TaskJobMode.ConsecutiveStopAtFailure && ChildJobs.Any(j => j.JobStateInfo.State == JobState.Failed)) { while (_queue.TryDequeue(out var failJob)) { failJob.Fail(); } } else { if (_queue.TryDequeue(out var nextJob)) { nextJob.StartJob(); } } } } } if (_acceptingChildJobs) { // do not conclude if more jobs may be added SetJobState(JobState.Suspended); return; } if (this.IsFinished()) { return; } var childJobs = ChildJobs.Cast <TaskChildJob>(); if (childJobs.All(j => j.IsCompleted)) { if (childJobs.Any(j => j.IsFaulted && !j.IsCanceled)) { SetJobState(JobState.Failed); } else if (childJobs.Any(j => j.IsCanceled)) { SetJobState(JobState.Stopped); } else { SetJobState(JobState.Completed); } } }
/// <summary>Returns a list of exceptions from this job and all child jobs.</summary> public void Errors(List <Exception> errors) { if (Error != null) { errors.Add(Error); } if (ChildJobs != null) { ChildJobs.ForEach(job => job.Errors(errors)); } }
/// <summary>Returns true if all child jobs are completed.</summary> public bool AreChildJobsComplete() { return(ChildJobs.TrueForAll(job => job.IsCompleted)); }
/// <summary>Returns true if job and all child jobs are completed.</summary> public bool IsJobAndChildJobsComplete() { return(isCompleted && ChildJobs.TrueForAll(job => job.IsJobAndChildJobsComplete())); }