コード例 #1
0
        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();
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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++;
            }
        }