protected override async ValueTask <IActivityExecutionResult> OnExecuteAsync(ActivityExecutionContext context) { var parentBlueprint = context.ActivityBlueprint.Parent; // Remove any blocking activities within the scope of the composite activity. var blockingActivities = context.WorkflowExecutionContext.WorkflowInstance.BlockingActivities; var blockingActivityIds = blockingActivities.Select(x => x.ActivityId).ToList(); var containedBlockingActivityIds = parentBlueprint == null ? blockingActivityIds : parentBlueprint.Activities.Where(x => blockingActivityIds.Contains(x.Id)).Select(x => x.Id).ToList(); var containedBlockingActivities = blockingActivities.Where(x => containedBlockingActivityIds.Contains(x.ActivityId)); foreach (var blockingActivity in containedBlockingActivities) { await context.WorkflowExecutionContext.RemoveBlockingActivityAsync(blockingActivity); } // Evict & remove any scope activities within the scope of the composite activity. var scopes = context.WorkflowInstance.Scopes.Select(x => x).Reverse().ToList(); var scopeIds = scopes.Select(x => x.ActivityId).ToList(); var containedScopeActivityIds = parentBlueprint == null ? scopeIds : parentBlueprint.Activities.Where(x => scopeIds.Contains(x.Id)).Select(x => x.Id).ToList(); foreach (var scopeId in containedScopeActivityIds) { var scopeActivity = context.WorkflowExecutionContext.GetActivityBlueprintById(scopeId) !; await context.WorkflowExecutionContext.EvictScopeAsync(scopeActivity); scopes.RemoveAll(x => x.ActivityId == scopeId); } context.WorkflowInstance.Scopes = new SimpleStack <ActivityScope>(scopes.AsEnumerable().Reverse()); // Return output. Output = new FinishOutput(ActivityOutput, OutcomeNames); return(Noop()); }
protected override async ValueTask <IActivityExecutionResult> OnExecuteAsync(ActivityExecutionContext context) { var parentBlueprint = context.ActivityBlueprint.Parent; var isRoot = parentBlueprint == null; // Remove any blocking activities within the scope of the composite activity. var blockingActivities = context.WorkflowExecutionContext.WorkflowInstance.BlockingActivities; var blockingActivityIds = blockingActivities.Select(x => x.ActivityId).ToList(); var containedBlockingActivityIds = parentBlueprint == null ? blockingActivityIds : parentBlueprint.Activities.Where(x => blockingActivityIds.Contains(x.Id)).Select(x => x.Id).ToList(); var containedBlockingActivities = blockingActivities.Where(x => containedBlockingActivityIds.Contains(x.ActivityId)); foreach (var blockingActivity in containedBlockingActivities) { await context.WorkflowExecutionContext.RemoveBlockingActivityAsync(blockingActivity); } // Evict & remove any scope activities within the scope of the composite activity. var scopes = context.WorkflowInstance.Scopes.Select(x => x).Reverse().ToList(); var scopeIds = scopes.Select(x => x.ActivityId).ToList(); var containedScopeActivityIds = parentBlueprint == null ? scopeIds : parentBlueprint.Activities.Where(x => scopeIds.Contains(x.Id)).Select(x => x.Id).ToList(); foreach (var scopeId in containedScopeActivityIds) { var scopeActivity = context.WorkflowExecutionContext.GetActivityBlueprintById(scopeId) !; await context.WorkflowExecutionContext.EvictScopeAsync(scopeActivity); scopes.RemoveAll(x => x.ActivityId == scopeId); } context.WorkflowInstance.Scopes = new SimpleStack <ActivityScope>(scopes.AsEnumerable().Reverse()); // Return output. Output = new FinishOutput(ActivityOutput, OutcomeNames); context.LogOutputProperty(this, nameof(Output), Output); if (isRoot) { // Clear activity scheduler to prevent other scheduled activities from adding new blocking activities, which would prevent the workflow from completing. context.WorkflowExecutionContext.ClearScheduledActivities(); } return(Noop()); }