If the steps are somehow independend regarding the dataflow within the method, but can’t be executed in a parallel matter, the following approach may be better readable:
void Run()
{
// list of actions, defines the order of execution
var actions = new List<Action<CancellationToken>>() {
ct => Step1(ct),
ct => Step2(ct),
ct => Step3(ct)
};
// execute actions and check for cancellation token
foreach(var action in actions)
{
action(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
}
return true;
}
If the steps don’t need the cancellation token because you can split them up in tiny units, you can even write a smaller list definition:
var actions = new List<Action>() {
Step1, Step2, Step3
};