diff --git a/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/FlowJoin.cs b/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/FlowJoin.cs index 1e93ca546..f5d02dda9 100644 --- a/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/FlowJoin.cs +++ b/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/FlowJoin.cs @@ -35,26 +35,15 @@ public class FlowJoin : Activity, IJoinNode /// protected override async ValueTask ExecuteAsync(ActivityExecutionContext context) { - var mode = context.Get(Mode); - - switch (mode) - { - case FlowJoinMode.WaitAll: - { - if (Flowchart.CanWaitAllProceed(context)) - { - Flowchart.CancelAncestorActivatesAsync(context); - await context.CompleteActivityAsync(); - } - - break; - } - case FlowJoinMode.WaitAny: - { - Flowchart.CancelAncestorActivatesAsync(context); - await context.CompleteActivityAsync(); - break; - } - } + Flowchart.CancelAncestorActivatesAsync(context); + await context.CompleteActivityAsync(); } + + protected override bool CanExecute(ActivityExecutionContext context) + => context.Get(Mode) switch + { + FlowJoinMode.WaitAny => true, + FlowJoinMode.WaitAll => Flowchart.CanWaitAllProceed(context), + _ => true + }; } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/Flowchart.cs b/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/Flowchart.cs index 03e333b32..65df2d963 100644 --- a/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/Flowchart.cs +++ b/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Activities/Flowchart.cs @@ -321,13 +321,20 @@ public class Flowchart : Container } } - var scheduleWorkOptions = new ScheduleWorkOptions + if (joinContext is not { Status: ActivityStatus.Running }) { - CompletionCallback = OnChildCompletedAsync, - ExistingActivityExecutionContext = joinContext - }; - await flowchartContext.ScheduleActivityAsync(outboundActivity, scheduleWorkOptions); - return true; + var scheduleWorkOptions = new ScheduleWorkOptions + { + CompletionCallback = OnChildCompletedAsync, + ExistingActivityExecutionContext = joinContext + }; + await flowchartContext.ScheduleActivityAsync(outboundActivity, scheduleWorkOptions); + return true; + } + else + { + return false; + } } public static bool CanWaitAllProceed(ActivityExecutionContext context) @@ -415,5 +422,13 @@ public class Flowchart : Container private async ValueTask OnActivityCanceledAsync(CancelSignal signal, SignalContext context) { await CompleteIfNoPendingWorkAsync(context.ReceiverActivityExecutionContext); + + var flowchartContext = context.ReceiverActivityExecutionContext!; + var flowchart = (Flowchart)flowchartContext.Activity; + var flowGraph = flowchart.GetFlowGraph(flowchartContext); + var flowScope = flowchart.GetFlowScope(flowchartContext); + + // Propagate canceled connections visited count by scheduling with Outcomes.Empty + await flowchart.ScheduleOutboundActivitiesAsync(flowGraph, flowScope, flowchartContext, context.SenderActivityExecutionContext.Activity, Outcomes.Empty); } } \ No newline at end of file