public override void OnActivityExecuted(WorkflowContext workflowContext, ActivityContext activityContext)
        {
            // for blocking activities only
            if (!activityContext.Activity.IsEvent)
            {
                return;
            }

            // activity records pointing to the executed activity
            var inboundActivities = workflowContext.GetInboundTransitions(activityContext.Record);


            // if a direct target of a Branch Activity is executed, then suppress all other direct waiting activities
            var parentBranchActivities = inboundActivities
                                         .Where(x => x.SourceActivityRecord.Name == this.Name)
                                         .Select(x => x.SourceActivityRecord)
                                         .ToList();

            if (parentBranchActivities.Any())
            {
                foreach (var parentBranch in parentBranchActivities)
                {
                    // remove all other waiting activities after the parent branch

                    var siblings  = workflowContext.GetOutboundTransitions(parentBranch).Select(x => x.DestinationActivityRecord).ToList();
                    var awaitings = workflowContext.Record.AwaitingActivities.Where(x => siblings.Contains(x.ActivityRecord)).ToList();
                    foreach (var awaiting in awaitings)
                    {
                        workflowContext.Record.AwaitingActivities.Remove(awaiting);
                    }
                }
            }
        }
コード例 #2
0
        public override void OnActivityExecuted(WorkflowContext workflowContext, ActivityContext activityContext) {

            // for blocking activities only
            if (!activityContext.Activity.IsEvent) {
                return;
            }

            // activity records pointing to the executed activity
            var inboundActivities = workflowContext.GetInboundTransitions(activityContext.Record);


            // if a direct target of a Branch Activity is executed, then suppress all other direct waiting activities
            var parentBranchActivities = inboundActivities
                .Where(x => x.SourceActivityRecord.Name == this.Name)
                .Select(x => x.SourceActivityRecord)
                .ToList();

            if (parentBranchActivities.Any()) {
                foreach (var parentBranch in parentBranchActivities) {
                    // remove all other waiting activities after the parent branch

                    var siblings = workflowContext.GetOutboundTransitions(parentBranch).Select(x => x.DestinationActivityRecord).ToList();
                    var awaitings = workflowContext.Record.AwaitingActivities.Where(x => siblings.Contains(x.ActivityRecord));
                    foreach (var awaiting in awaitings) {
                        workflowContext.Record.AwaitingActivities.Remove(awaiting);
                    }
                }
            }
        }
コード例 #3
0
        public override IEnumerable<LocalizedString> Execute(WorkflowContext workflowContext, ActivityContext activityContext) {
            // wait for all incoming branches to trigger the Execute before returning the result
            var branchesState = workflowContext.GetStateFor<string>(activityContext.Record, "Branches");

            if (String.IsNullOrWhiteSpace(branchesState)) {
                yield break;
            }
            
            var branches = GetBranches(branchesState);
            var inboundActivities = workflowContext.GetInboundTransitions(activityContext.Record);
            var done = inboundActivities
                .All(x => branches.Contains(GetTransitionKey(x)));

            if(done) {
                yield return T("Done");
            } 
        }
コード例 #4
0
        public override IEnumerable <LocalizedString> Execute(WorkflowContext workflowContext, ActivityContext activityContext)
        {
            // wait for all incoming branches to trigger the Execute before returning the result
            var branchesState = workflowContext.GetStateFor <string>(activityContext.Record, "Branches");

            if (String.IsNullOrWhiteSpace(branchesState))
            {
                yield break;
            }

            var branches          = GetBranches(branchesState);
            var inboundActivities = workflowContext.GetInboundTransitions(activityContext.Record);
            var done = inboundActivities
                       .All(x => branches.Contains(GetTransitionKey(x)));

            if (done)
            {
                yield return(T("Done"));
            }
        }