diff --git a/src/core/Elsa.Core/Activities/ControlFlow/Finish/Finish.cs b/src/core/Elsa.Core/Activities/ControlFlow/Finish/Finish.cs index de36cc998..3cf8169a7 100644 --- a/src/core/Elsa.Core/Activities/ControlFlow/Finish/Finish.cs +++ b/src/core/Elsa.Core/Activities/ControlFlow/Finish/Finish.cs @@ -1,3 +1,4 @@ +using System.Linq; using Elsa.ActivityResults; using Elsa.Attributes; using Elsa.Services; @@ -8,7 +9,7 @@ namespace Elsa.Activities.ControlFlow { [Activity( Category = "Workflows", - Description = "Removes any blocking activities and sets the status of the workflow to Completed." + Description = "Removes any blocking activities from the current container (workflow or composite activity)." )] public class Finish : Activity { @@ -17,8 +18,13 @@ namespace Elsa.Activities.ControlFlow protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context) { - context.WorkflowExecutionContext.WorkflowInstance.BlockingActivities.Clear(); + var parentBlueprint = context.ActivityBlueprint.Parent; + 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(); + blockingActivities.RemoveWhere(x => containedBlockingActivityIds.Contains(x.ActivityId)); + return Done(OutputValue); } } diff --git a/src/samples/worker/Elsa.Samples.Timers/Activities/MyContainer1.cs b/src/samples/worker/Elsa.Samples.Timers/Activities/MyContainer1.cs index b52479da9..f89e88c3b 100644 --- a/src/samples/worker/Elsa.Samples.Timers/Activities/MyContainer1.cs +++ b/src/samples/worker/Elsa.Samples.Timers/Activities/MyContainer1.cs @@ -34,7 +34,9 @@ namespace Elsa.Samples.Timers.Activities .WriteLine("Timer C went off") .Then("Join1"); }) - .Add(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join1").WriteLine("Container 1 Joined!"); + .Add(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join1") + .WriteLine("Container 1 Joined!") + .Finish(); } } } \ No newline at end of file diff --git a/src/samples/worker/Elsa.Samples.Timers/Activities/MyContainer2.cs b/src/samples/worker/Elsa.Samples.Timers/Activities/MyContainer2.cs index 8b9c36d15..c1cdf269d 100644 --- a/src/samples/worker/Elsa.Samples.Timers/Activities/MyContainer2.cs +++ b/src/samples/worker/Elsa.Samples.Timers/Activities/MyContainer2.cs @@ -20,22 +20,23 @@ namespace Elsa.Samples.Timers.Activities fork.When("C") .Then() .Then("Join2"); - + fork .When("D") .While(true, @while => @while .Timer(Duration.FromSeconds(1)) .WriteLine("Timer D went off")) .Then("Join2"); - + fork .When("E") .Timer(Duration.FromSeconds(15)) .WriteLine("Timer E went off. Exiting fork.") .Then("Join2"); }) - .Add(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join2").WriteLine("Container 2 Joined!") - ; + .Add(join => join.WithMode(Join.JoinMode.WaitAny)).WithName("Join2") + .WriteLine("Container 2 Joined!") + .Finish(); } } } \ No newline at end of file