diff --git a/Samples.sln b/Samples.sln
index 2996aaa29..abf6b959b 100644
--- a/Samples.sln
+++ b/Samples.sln
@@ -98,12 +98,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.FileBasedWorkf
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dashboards", "dashboards", "{86773701-E2D0-41B4-A9BF-836E6902C7D3}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "alpinejs", "alpinejs", "{5091DF54-2733-48D6-9577-1BDBC8A698F6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Alpine.Web", "src\dashboards\aspnetcore+alpinejs\ElsaDashboard.Alpine.Web\ElsaDashboard.Alpine.Web.csproj", "{E70A85E9-C649-483F-AA8E-4531D86AD595}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ReadModelHttp", "src\samples\Elsa.Samples.ReadModelHttp\Elsa.Samples.ReadModelHttp.csproj", "{E4485289-F1DF-4322-B07D-9A0C9B002D31}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.WhileLoopConsole", "src\samples\Elsa.Samples.WhileLoopConsole\Elsa.Samples.WhileLoopConsole.csproj", "{6B83CCE1-D523-4E3F-84EB-8D79AAF6F7C2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.WhileLoopWorker", "src\samples\Elsa.Samples.WhileLoopWorker\Elsa.Samples.WhileLoopWorker.csproj", "{85A70E7C-A4AC-49BA-942B-635F974DE255}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -231,14 +231,18 @@ Global
{8DDF71CE-573D-4620-82F7-77507BB198D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8DDF71CE-573D-4620-82F7-77507BB198D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8DDF71CE-573D-4620-82F7-77507BB198D5}.Release|Any CPU.Build.0 = Release|Any CPU
- {E70A85E9-C649-483F-AA8E-4531D86AD595}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E70A85E9-C649-483F-AA8E-4531D86AD595}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E70A85E9-C649-483F-AA8E-4531D86AD595}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E70A85E9-C649-483F-AA8E-4531D86AD595}.Release|Any CPU.Build.0 = Release|Any CPU
{E4485289-F1DF-4322-B07D-9A0C9B002D31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E4485289-F1DF-4322-B07D-9A0C9B002D31}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E4485289-F1DF-4322-B07D-9A0C9B002D31}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E4485289-F1DF-4322-B07D-9A0C9B002D31}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6B83CCE1-D523-4E3F-84EB-8D79AAF6F7C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6B83CCE1-D523-4E3F-84EB-8D79AAF6F7C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6B83CCE1-D523-4E3F-84EB-8D79AAF6F7C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6B83CCE1-D523-4E3F-84EB-8D79AAF6F7C2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {85A70E7C-A4AC-49BA-942B-635F974DE255}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {85A70E7C-A4AC-49BA-942B-635F974DE255}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {85A70E7C-A4AC-49BA-942B-635F974DE255}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {85A70E7C-A4AC-49BA-942B-635F974DE255}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -284,9 +288,9 @@ Global
{44E0B699-A140-4551-A0E9-9FD9F171A9C2} = {468E498C-59DB-4541-8D8A-0D89DE9083AB}
{8DDF71CE-573D-4620-82F7-77507BB198D5} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
{86773701-E2D0-41B4-A9BF-836E6902C7D3} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925}
- {5091DF54-2733-48D6-9577-1BDBC8A698F6} = {86773701-E2D0-41B4-A9BF-836E6902C7D3}
- {E70A85E9-C649-483F-AA8E-4531D86AD595} = {5091DF54-2733-48D6-9577-1BDBC8A698F6}
{E4485289-F1DF-4322-B07D-9A0C9B002D31} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
+ {6B83CCE1-D523-4E3F-84EB-8D79AAF6F7C2} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
+ {85A70E7C-A4AC-49BA-942B-635F974DE255} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158}
diff --git a/src/samples/Elsa.Samples.WhileLoopConsole/Elsa.Samples.WhileLoopConsole.csproj b/src/samples/Elsa.Samples.WhileLoopConsole/Elsa.Samples.WhileLoopConsole.csproj
new file mode 100644
index 000000000..7fbd68615
--- /dev/null
+++ b/src/samples/Elsa.Samples.WhileLoopConsole/Elsa.Samples.WhileLoopConsole.csproj
@@ -0,0 +1,16 @@
+
+
+
+ Exe
+ netcoreapp3.1
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/samples/Elsa.Samples.WhileLoopConsole/Program.cs b/src/samples/Elsa.Samples.WhileLoopConsole/Program.cs
new file mode 100644
index 000000000..13133cb7b
--- /dev/null
+++ b/src/samples/Elsa.Samples.WhileLoopConsole/Program.cs
@@ -0,0 +1,32 @@
+using System.Threading.Tasks;
+using Elsa.Services;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Elsa.Samples.WhileLoopConsole
+{
+ ///
+ /// Demonstrates a workflow with a While looping construct.
+ ///
+ static class Program
+ {
+ private static async Task Main()
+ {
+ // Create a service container with Elsa services.
+ var services = new ServiceCollection()
+ .AddElsa()
+ .AddConsoleActivities()
+ .AddWorkflow()
+ .BuildServiceProvider();
+
+ // Run startup actions (not needed when registering Elsa with a Host).
+ var startupRunner = services.GetRequiredService();
+ await startupRunner.StartupAsync();
+
+ // Get a workflow runner.
+ var workflowRunner = services.GetService();
+
+ // Execute the workflow.
+ await workflowRunner.RunWorkflowAsync();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/samples/Elsa.Samples.WhileLoopConsole/WhileMakingACallWorkflow.cs b/src/samples/Elsa.Samples.WhileLoopConsole/WhileMakingACallWorkflow.cs
new file mode 100644
index 000000000..a6719de2b
--- /dev/null
+++ b/src/samples/Elsa.Samples.WhileLoopConsole/WhileMakingACallWorkflow.cs
@@ -0,0 +1,29 @@
+using System;
+using Elsa.Activities.Console;
+using Elsa.Activities.ControlFlow;
+using Elsa.Activities.Timers;
+using Elsa.Builders;
+using NodaTime;
+
+namespace Elsa.Samples.WhileLoopConsole
+{
+ ///
+ /// This workflow prompts the user to enter an integer start value, then iterates back from that value to 0.
+ /// The workflow also demonstrates retrieving runtime values such as user input.
+ ///
+ public class WhileMakingACallWorkflow : IWorkflow
+ {
+ public void Build(IWorkflowBuilder workflow)
+ {
+ workflow
+ .WriteLine("Simulating a phone call... ringgg ringg.")
+ .While(context => !context.GetVariable("CallFinished"),
+ @while =>
+ {
+ @while
+ .TimerEvent(Duration.FromSeconds(5));
+ })
+ .WriteLine("Workflow finished.");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/samples/Elsa.Samples.WhileLoopWorker/Elsa.Samples.WhileLoopWorker.csproj b/src/samples/Elsa.Samples.WhileLoopWorker/Elsa.Samples.WhileLoopWorker.csproj
new file mode 100644
index 000000000..aa6ddd35b
--- /dev/null
+++ b/src/samples/Elsa.Samples.WhileLoopWorker/Elsa.Samples.WhileLoopWorker.csproj
@@ -0,0 +1,10 @@
+
+
+
+ net5.0
+
+
+
+
+
+
diff --git a/src/samples/Elsa.Samples.WhileLoopWorker/Program.cs b/src/samples/Elsa.Samples.WhileLoopWorker/Program.cs
new file mode 100644
index 000000000..af4d2a730
--- /dev/null
+++ b/src/samples/Elsa.Samples.WhileLoopWorker/Program.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+
+namespace Elsa.Samples.WhileLoopWorker
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ CreateHostBuilder(args).Build().Run();
+ }
+
+ public static IHostBuilder CreateHostBuilder(string[] args) =>
+ Host.CreateDefaultBuilder(args)
+ .ConfigureServices((hostContext, services) => { services.AddHostedService(); });
+ }
+}
\ No newline at end of file
diff --git a/src/samples/Elsa.Samples.WhileLoopWorker/Properties/launchSettings.json b/src/samples/Elsa.Samples.WhileLoopWorker/Properties/launchSettings.json
new file mode 100644
index 000000000..505149918
--- /dev/null
+++ b/src/samples/Elsa.Samples.WhileLoopWorker/Properties/launchSettings.json
@@ -0,0 +1,11 @@
+{
+ "profiles": {
+ "Elsa.Samples.WhileLoopWorker": {
+ "commandName": "Project",
+ "dotnetRunMessages": "true",
+ "environmentVariables": {
+ "DOTNET_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/samples/Elsa.Samples.WhileLoopWorker/Worker.cs b/src/samples/Elsa.Samples.WhileLoopWorker/Worker.cs
new file mode 100644
index 000000000..9e0d27c39
--- /dev/null
+++ b/src/samples/Elsa.Samples.WhileLoopWorker/Worker.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+
+namespace Elsa.Samples.WhileLoopWorker
+{
+ public class Worker : BackgroundService
+ {
+ private readonly ILogger _logger;
+
+ public Worker(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+ {
+ while (!stoppingToken.IsCancellationRequested)
+ {
+ _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
+ await Task.Delay(1000, stoppingToken);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/samples/Elsa.Samples.WhileLoopWorker/appsettings.Development.json b/src/samples/Elsa.Samples.WhileLoopWorker/appsettings.Development.json
new file mode 100644
index 000000000..8983e0fc1
--- /dev/null
+++ b/src/samples/Elsa.Samples.WhileLoopWorker/appsettings.Development.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ }
+}
diff --git a/src/samples/Elsa.Samples.WhileLoopWorker/appsettings.json b/src/samples/Elsa.Samples.WhileLoopWorker/appsettings.json
new file mode 100644
index 000000000..8983e0fc1
--- /dev/null
+++ b/src/samples/Elsa.Samples.WhileLoopWorker/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ }
+}