diff --git a/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs b/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs index 82d906973..1b034c36d 100644 --- a/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs +++ b/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -71,6 +72,36 @@ namespace Elsa.Services.Models public bool HasBlockingActivities => WorkflowInstance.BlockingActivities.Any(); public object? WorkflowContext { get; set; } + /// + /// A collection of tasks to execute post-workflow burst execution. + /// + public IDictionary>> Tasks { get; set; } = new Dictionary>>(); + + public void RegisterTask(string groupName, Func task) + { + if (!Tasks.ContainsKey(groupName)) + { + var list = new List> { task }; + Tasks[groupName] = list; + } + else + { + Tasks[groupName].Add(task); + } + } + + public IEnumerable> GetRegisteredTasks(string groupName) => Tasks.ContainsKey(groupName) ? Tasks[groupName] : Enumerable.Empty>(); + + public async ValueTask ExecuteRegisteredTasksAsync(string groupName, CancellationToken cancellationToken = default) + { + var tasks = GetRegisteredTasks(groupName); + + foreach (var task in tasks) + await task(this, cancellationToken); + + Tasks.Remove(groupName); + } + public void SetVariable(string name, object? value) => WorkflowInstance.Variables.Set(name, value); public T? GetVariable(string name) => WorkflowInstance.Variables.Get(name); public object? GetVariable(string name) => WorkflowInstance.Variables.Get(name); @@ -100,9 +131,9 @@ namespace Elsa.Services.Models return activityInstance.Output; } - public T GetOutputFrom(string activityName) => (T)GetOutputFrom(activityName)!; + public T GetOutputFrom(string activityName) => (T) GetOutputFrom(activityName)!; public void SetWorkflowContext(object? value) => WorkflowContext = value; - public T GetWorkflowContext() => (T)WorkflowContext!; + public T GetWorkflowContext() => (T) WorkflowContext!; public async ValueTask> ActivateActivitiesAsync(CancellationToken cancellationToken = default) {