private void PerformMission(MissionWrapper mission, IArgumentHolder globalArgumentHolder, Barrier finishingBarrier) { mission.RunState = RunState.RUNNING; var result = mission.ActualMission.Perform(mission.ArgumentHolder); globalArgumentHolder.RegisterResult(mission.ActualMission.Name, result); foreach (var dependantMission in mission.DependantMissions) { bool shouldPerform = false; lock (dependantMission) { dependantMission.ArgumentHolder.RegisterResult(mission.ActualMission.Name, result); dependantMission.UnmetDependencies--; if (dependantMission.UnmetDependencies == 0) { shouldPerform = true; } } if (shouldPerform) { var taskToPerform = dependantMission; Task.Run(() => PerformMission(taskToPerform, globalArgumentHolder, finishingBarrier)); } } mission.RunState = RunState.FINISHED; finishingBarrier.RemoveParticipant(); }
public void RegisterMission(IMission newMission) { if (newMission == null) { throw new ArgumentNullException(nameof(newMission)); } var newMissionWrapper = new MissionWrapper(newMission); // Note that verifying the mission's dependencies exist here is critical: this ensures we can't have circular dependencies! UpdateMissionDependencies(newMissionWrapper); _missionWrappers.Add(newMission.Name, newMissionWrapper); }
private void UpdateMissionDependencies(MissionWrapper mission) { foreach (var dependency in mission.ActualMission.Dependencies) { MissionWrapper dependencyWrapper; if (!_missionWrappers.TryGetValue(dependency, out dependencyWrapper)) { throw new ArgumentException(string.Format("Task {0} depends on newTask {1} which was never registered!", mission.ActualMission.Name, dependency)); } dependencyWrapper.DependantMissions.Add(mission); mission.UnmetDependencies++; } }