static void AddTransitionData(NativeActivityMetadata metadata, InternalTransition internalTransition, Transition transition) { TransitionData transitionData = new TransitionData(); Activity <bool> condition = transition.Condition; transitionData.Condition = condition; if (condition != null) { metadata.AddChild(condition); } Activity action = transition.Action; transitionData.Action = action; if (action != null) { metadata.AddChild(action); } if (transition.To != null) { transitionData.To = transition.To.InternalState; } internalTransition.TransitionDataList.Add(transitionData); }
void OnConditionComplete(NativeActivityContext context, ActivityInstance completedInstance, bool result) { StateMachineEventManager eventManager = this.EventManager.Get(context); int triggerId = eventManager.CurrentBeingProcessedEvent.TriggedId; if (result) { TakeTransition(context, eventManager, triggerId); } else { int currentConditionIndex = eventManager.CurrentConditionIndex; InternalTransition transition = GetInternalTransition(triggerId); currentConditionIndex++; if (currentConditionIndex < transition.TransitionDataList.Count) { eventManager.CurrentConditionIndex = currentConditionIndex; context.ScheduleActivity <bool>(transition.TransitionDataList[currentConditionIndex].Condition, this.onConditionComplete, null); } else { //Schedule current trigger again firstly. context.ScheduleActivity(transition.Trigger, onTriggerComplete); this.currentRunningTriggers.Set(context, this.currentRunningTriggers.Get(context) + 1); //check whether there is any other trigger completed. ProcessNextTriggerCompletedEvent(context, eventManager); } } }
void OnTriggerComplete(NativeActivityContext context, ActivityInstance completedInstance) { int runningTriggers = this.currentRunningTriggers.Get(context); this.currentRunningTriggers.Set(context, --runningTriggers); bool isOnExit = this.isExiting.Get(context); if (!context.IsCancellationRequested && runningTriggers == 0 && !this.hasRunningChildState.Get(context) && isOnExit) { ScheduleExit(context); } else if (completedInstance.State == ActivityInstanceState.Closed) { InternalTransition internalTransition = null; this.triggerInternalTransitionMapping.TryGetValue(completedInstance.Activity, out internalTransition); Debug.Assert(internalTransition != null, "internalTransition should be added into triggerInternalTransitionMapping in CacheMetadata."); StateMachineEventManager eventManager = this.EventManager.Get(context); bool canBeProcessedImmediately; eventManager.RegisterCompletedEvent( new TriggerCompletedEvent { Bookmark = this.evaluateConditionBookmark.Get(context), TriggedId = internalTransition.InternalTransitionIndex }, out canBeProcessedImmediately ); if (canBeProcessedImmediately) { StartEvaluateCondition(context); } } }
void ScheduleAction(NativeActivityContext context) { StateMachineEventManager eventManager = this.EventManager.Get(context); if (eventManager.IsReferredByBeingProcessedEvent(this.evaluateConditionBookmark.Get(context))) { InternalTransition transition = GetInternalTransition(eventManager.CurrentBeingProcessedEvent.TriggedId); Activity action = transition.TransitionDataList[eventManager.CurrentConditionIndex].Action; if (action != null) { context.ScheduleActivity(action); } } RemoveBookmarks(context); }
void StartEvaluateCondition(NativeActivityContext context) { //Start to evaluate conditions of the trigger which represented by currentTriggerIndex StateMachineEventManager eventManager = this.EventManager.Get(context); int triggerId = eventManager.CurrentBeingProcessedEvent.TriggedId; eventManager.CurrentConditionIndex = 0; InternalTransition transition = GetInternalTransition(triggerId); if (transition.IsUnconditional) { TakeTransition(context, eventManager, triggerId); } else { context.ScheduleActivity <bool>(GetCondition(triggerId, eventManager.CurrentConditionIndex), this.onConditionComplete, null); } }
void ProcessTransitions(NativeActivityMetadata metadata) { for (int i = 0; i < this.Transitions.Count; i++) { Transition transition = this.Transitions[i]; InternalTransition internalTransition = null; if (!triggerInternalTransitionMapping.TryGetValue(transition.Trigger, out internalTransition)) { metadata.AddChild(transition.Trigger); internalTransition = new InternalTransition { Trigger = transition.Trigger, InternalTransitionIndex = this.internalTransitions.Count, }; triggerInternalTransitionMapping.Add(transition.Trigger, internalTransition); this.internalTransitions.Add(internalTransition); } AddTransitionData(metadata, internalTransition, transition); } }