Continue-As-New - .NET SDK
This page answers the following questions for .NET developers:
- What is Continue-As-New?
- How to Continue-As-New?
- When is it right to Continue-as-New?
- How to test Continue-as-New?
What is Continue-As-New?
Continue-As-New lets a Workflow Execution close successfully and creates a new Workflow Execution. You can think of it as a checkpoint when your Workflow gets too long or approaches certain scaling limits.
The new Workflow Execution is in the same chain; it keeps the same Workflow Id but gets a new Run Id and a fresh Event History. It also receives your Workflow's usual parameters.
How to Continue-As-New using the .NET SDK
First, design your Workflow parameters so that you can pass in the "current state" when you Continue-As-New into the next Workflow run.
This state is typically set to None
for the original caller of the Workflow.
View the source code
in the context of the rest of the application code.
public record Input
{
public State State { get; init; } = new();
public bool TestContinueAsNew { get; init; }
}
[WorkflowInit]
public ClusterManagerWorkflow(Input input)
The test hook in the above snippet is covered below.
Inside your Workflow, throw a CreateContinueAsNewException
exception.
This stops the Workflow right away and starts a new one.
View the source code
in the context of the rest of the application code.
throw Workflow.CreateContinueAsNewException((ClusterManagerWorkflow wf) => wf.RunAsync(new()
{
State = CurrentState,
TestContinueAsNew = input.TestContinueAsNew,
}));
Considerations for Workflows with Message Handlers
If you use Updates or Signals, don't call Continue-as-New from the handlers.
Instead, wait for your handlers to finish in your main Workflow before you throw CreateContinueAsNewException
.
See the AllHandlersFinished
example for guidance.
When is it right to Continue-as-New using the .NET SDK?
Use Continue-as-New when your Workflow might hit Event History Limits.
Temporal tracks your Workflow's progress against these limits to let you know when you should Continue-as-New.
Call Workflow.ContinueAsNewSuggested
to check if it's time.
How to test Continue-as-New using the .NET SDK
Testing Workflows that naturally Continue-as-New may be time-consuming and resource-intensive. Instead, add a test hook to check your Workflow's Continue-as-New behavior faster in automated tests.
For example, when TestContinueAsNew == true
, this sample creates a test-only variable called maxHistoryLength
and sets it to a small value.
A helper variable in the Workflow checks it each time it considers using Continue-as-New:
View the source code
in the context of the rest of the application code.
private bool ShouldContinueAsNew =>
// Don't continue as new while update running
Workflow.AllHandlersFinished &&
// Continue if suggested or, for ease of testing, max history reached
(Workflow.ContinueAsNewSuggested || Workflow.CurrentHistoryLength > maxHistoryLength);