diff --git a/Directory.Packages.props b/Directory.Packages.props
index 332939a5..34cdb26a 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -1,47 +1,48 @@
-
- true
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/all.sln b/all.sln
index 1dd0ab3c..ecc8403c 100644
--- a/all.sln
+++ b/all.sln
@@ -119,6 +119,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.Common", "src\Dapr.Com
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.Common.Test", "test\Dapr.Common.Test\Dapr.Common.Test.csproj", "{CDB47863-BEBD-4841-A807-46D868962521}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkflowSubWorkflow", "examples\Workflow\WorkflowSubWorkflow\WorkflowSubWorkflow.csproj", "{E8109EE6-9B06-4061-86EB-72395AEC4EC7}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -303,6 +305,10 @@ Global
{CDB47863-BEBD-4841-A807-46D868962521}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CDB47863-BEBD-4841-A807-46D868962521}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CDB47863-BEBD-4841-A807-46D868962521}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E8109EE6-9B06-4061-86EB-72395AEC4EC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E8109EE6-9B06-4061-86EB-72395AEC4EC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E8109EE6-9B06-4061-86EB-72395AEC4EC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E8109EE6-9B06-4061-86EB-72395AEC4EC7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -359,6 +365,7 @@ Global
{DFBABB04-50E9-42F6-B470-310E1B545638} = {27C5D71D-0721-4221-9286-B94AB07B58CF}
{B445B19C-A925-4873-8CB7-8317898B6970} = {27C5D71D-0721-4221-9286-B94AB07B58CF}
{CDB47863-BEBD-4841-A807-46D868962521} = {DD020B34-460F-455F-8D17-CF4A949F100B}
+ {E8109EE6-9B06-4061-86EB-72395AEC4EC7} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {65220BF2-EAE1-4CB2-AA58-EBE80768CB40}
diff --git a/examples/Workflow/WorkflowSubWorkflow/Program.cs b/examples/Workflow/WorkflowSubWorkflow/Program.cs
new file mode 100644
index 00000000..259edb5a
--- /dev/null
+++ b/examples/Workflow/WorkflowSubWorkflow/Program.cs
@@ -0,0 +1,29 @@
+using Dapr.Workflow;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using WorkflowSubWorkflow.Workflows;
+
+var builder = Host.CreateDefaultBuilder(args).ConfigureServices(services =>
+{
+ services.AddDaprWorkflow(options =>
+ {
+ options.RegisterWorkflow();
+ options.RegisterWorkflow();
+ });
+});
+
+using var host = builder.Build();
+await host.StartAsync();
+
+await using var scope = host.Services.CreateAsyncScope();
+var daprWorkflowClient = scope.ServiceProvider.GetRequiredService();
+
+var instanceId = $"demo-workflow-{Guid.NewGuid().ToString()[..8]}";
+await daprWorkflowClient.ScheduleNewWorkflowAsync(nameof(DemoWorkflow), instanceId, instanceId );
+
+await daprWorkflowClient.WaitForWorkflowCompletionAsync(instanceId);
+var state = await daprWorkflowClient.GetWorkflowStateAsync(instanceId);
+Console.WriteLine($"Workflow {instanceId}, state: {state.RuntimeStatus}");
+
+state = await daprWorkflowClient.GetWorkflowStateAsync($"{instanceId}-sub");
+Console.WriteLine($"Workflow {instanceId}-sub, state: {state.RuntimeStatus}");
diff --git a/examples/Workflow/WorkflowSubWorkflow/WorkflowSubWorkflow.csproj b/examples/Workflow/WorkflowSubWorkflow/WorkflowSubWorkflow.csproj
new file mode 100644
index 00000000..36e8786b
--- /dev/null
+++ b/examples/Workflow/WorkflowSubWorkflow/WorkflowSubWorkflow.csproj
@@ -0,0 +1,18 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoSubWorkflow.cs b/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoSubWorkflow.cs
new file mode 100644
index 00000000..11b9b99c
--- /dev/null
+++ b/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoSubWorkflow.cs
@@ -0,0 +1,20 @@
+using Dapr.Workflow;
+
+namespace WorkflowSubWorkflow.Workflows;
+
+internal sealed class DemoSubWorkflow : Workflow
+{
+ ///
+ /// Override to implement workflow logic.
+ ///
+ /// The workflow context.
+ /// The deserialized workflow input.
+ /// The output of the workflow as a task.
+ public override async Task RunAsync(WorkflowContext context, string instanceId)
+ {
+ Console.WriteLine($"Workflow {context.InstanceId} started");
+ Console.WriteLine($"Received input: {instanceId}");
+ await context.CreateTimer(TimeSpan.FromSeconds(5));
+ return true;
+ }
+}
diff --git a/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoWorkflow.cs b/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoWorkflow.cs
new file mode 100644
index 00000000..90a47e74
--- /dev/null
+++ b/examples/Workflow/WorkflowSubWorkflow/Workflows/DemoWorkflow.cs
@@ -0,0 +1,21 @@
+using Dapr.Workflow;
+
+namespace WorkflowSubWorkflow.Workflows;
+
+internal sealed class DemoWorkflow : Workflow
+{
+ ///
+ /// Override to implement workflow logic.
+ ///
+ /// The workflow context.
+ /// The deserialized workflow input.
+ /// The output of the workflow as a task.
+ public override async Task RunAsync(WorkflowContext context, string instanceId)
+ {
+ Console.WriteLine($"Workflow {instanceId} started");
+ var subInstanceId = instanceId + "-sub";
+ var options = new ChildWorkflowTaskOptions(subInstanceId);
+ await context.CallChildWorkflowAsync(nameof(DemoSubWorkflow), "Hello, sub-workflow", options);
+ return true;
+ }
+}