void ProcessStep( IRunState runState, ActivityImplementationBase windowsActivity, Action <IRunState, ActivityImplementationBase, EntityRef> actionOnCompletion, Action <IRunState, ActivityImplementationBase> actionOnPause, Func <bool> step ) { //TODO: Retire this mess. This is all overly complicated. _pendingActivities.Enqueue( () => { var result = step(); return(CompleteActivityRun( result, runState, exitPoint => // on completed { if (actionOnCompletion != null) { actionOnCompletion(runState, windowsActivity, exitPoint); } }, () => // on paused { if (actionOnPause != null) { actionOnPause(runState, windowsActivity); } })); } ); }
/// <summary> /// Add a resume activity to the pending list. NOTE! This does not resume the activity. /// /// </summary> public void ScheduleResume(IRunState runState, ActivityImplementationBase windowsActivity, IWorkflowEvent resumeEvent, Action <IRunState, ActivityImplementationBase, EntityRef> actionOnCompletion, Action <IRunState, ActivityImplementationBase> actionOnPause) { Func <bool> step = () => { runState.RecordTrace(windowsActivity.ActivityInstance.Name); return(windowsActivity.ResumeInContext(runState, resumeEvent)); }; ProcessStep(runState, windowsActivity, actionOnCompletion, actionOnPause, step); }
public void AddActivityToCache(ActivityImplementationBase activity) { long key = activity.ActivityInstance.Id; if (!_cachedInstances.ContainsKey(key)) { _cachedInstances.Add(key, activity); _exitPointsCache.Add(key, activity.ActivityInstance.GetExitPoints()); } else { throw new ApplicationException("Attempted to recache an activity instance:" + key); } }
/// <summary> /// Add an activity to the pending list. NOTE! This does not run the activity. /// </summary> public void ScheduleActivity(IRunState runState, ActivityImplementationBase windowsActivity, ActivityInputs inputs, Action <IRunState, ActivityImplementationBase, EntityRef> actionOnCompletion, Action <IRunState, ActivityImplementationBase> actionOnPause) { Func <bool> step = () => { runState.StepsTakenInSession++; runState.CurrentActivity = windowsActivity.ActivityInstance; runState.RecordTrace(windowsActivity.ActivityInstance.Name); return(windowsActivity.RunInContext(runState, inputs)); }; ProcessStep(runState, windowsActivity, actionOnCompletion, actionOnPause, step); }
private void NextStepCompletionCallback(IRunState context, ActivityImplementationBase completedInstance, EntityRef exitPointRef) { var childActivity = ((ActivityImplementationBase)completedInstance).ActivityInstance; var transition = context.Metadata.GetTransitionForExitPoint(childActivity, exitPointRef); if (transition != null) { if (NeedToSuspend(context)) { MarkRunSuspended(context, childActivity); } else { var nextActivity = transition.ToActivity; context.ExitPointId = null; ScheduleNextStep(context, nextActivity); } } else { Termination termination; try { termination = _activityInstanceAsWf.Terminations.Single( t => t.FromActivity.Id == childActivity.Id && t.FromExitPoint.Id == exitPointRef.Id); } catch (InvalidOperationException err) { throw new WorkflowRunException(string.Format("There should be only one valid termination found for the given activity and exit point. \nWorkflow: {0} \n Last activity: {1}", _activityInstanceAsWf.GetIdString(), childActivity.Name ?? "(Unnamed)"), err); } context.ExitPointId = termination.WorkflowExitPoint; MarkRunCompleted(context); context.FlushInternalArgs(); } }
private void NextStepPausedCallback(IRunState context, ActivityImplementationBase pausedInstance) { MarkRunPaused(context, pausedInstance.ActivityInstance); }
/// <summary> /// Resume a paused activity on the invoker /// </summary> /// <param name="runState">The runstate</param> /// <param name="windowsActivity">The activity</param> /// <param name="resumeEvent">The trigger event for the resume</param> /// <returns></returns> public bool Resume(IRunState runState, ActivityImplementationBase windowsActivity, IWorkflowEvent resumeEvent) { ScheduleResume(runState, windowsActivity, resumeEvent, null, null); return(RunTillCompletion(runState)); }
/// <summary> /// Run an activity on the invoker /// </summary> /// <param name="runState">The runState for the workflow</param> /// <param name="windowsActivity">The activity to run</param> /// <param name="inputs">The inputs</param> /// <returns></returns> public bool Run(IRunState runState, ActivityImplementationBase windowsActivity, ActivityInputs inputs) { ScheduleActivity(runState, windowsActivity, inputs, null, null); return(RunTillCompletion(runState)); }