Running pipeline blocks synchronously or asynchronously

Abstract

How to use the AsyncPipelineBlock and the SyncPipelineBlock class to run Commerce pipeline asynchronously or synchronously.

Starting with Sitecore XC 10.0, all pipeline blocks derive from either the AsyncPipelineBlock class or the SyncPipelineBlock class, depending on whether a method must run asynchronously or synchronously.

Using the AsyncPipelineBlock and SyncPipelineBlock classes

To execute a pipeline block synchronously, use the SyncPipelineBlock class. The method name used to run a block synchronously is Run(). For example:

public class SampleSyncBlock : SyncPipelineBlock<string, string, CommercePipelineExecutionContext>
{   
    public override string Run(string arg, CommercePipelineExecutionContext context)
    {
        ////
        return arg;
    }
}

To run a pipeline block asynchronously, use the AsyncPipelineBlock. The method name used to run a block asynchronously is RunAsync(). For example:

public class SampleAsyncBlock : AsyncPipelineBlock<string, string, CommercePipelineExecutionContext>
{   
    public override Task<string> RunAsync(string arg, CommercePipelineExecutionContext context)
    {
        ////
        return Task.FromResult(arg);
    }
}

The IPipeline RunAsync() method

Starting with Sitecore XC 10.0, the IPipeline interface method is changed from Run to RunAsync() because the method is an asynchronous operation.

Each pipeline can use a combination of synchronous and asynchronous blocks.

Conditional pipeline blocks

Starting with Sitecore 10.0, all conditional pipeline blocks must derive from either one of the following synchronous or asynchronous block classes:

  • ConditionalPipelineBLock

  • AsyncConditionalPipelineBLock

To run a conditional pipeline block synchronously, you derive it from the ConditionalPipelineBLock class. For example:

public class SampleSyncConditionalPipelineBlock : ConditionalPipelineBlock<string, string, CommercePipelineExecutionContext>
{   
    public override string Run(string arg, CommercePipelineExecutionContext context)
    {
        return arg;
    }
    public override string ContinueTask(string arg, CommercePipelineExecutionContext context)
{
    return arg; 
}  

To run a conditional block asynchronously, you derive it from the AsyncConditionalPipelineBLock class. For example:

public class SampleAsyncConditionalPipelineBlock : AsyncConditionalPipelineBlock<string, string, CommercePipelineExecutionContext>
{   
    public override Task<string> RunAsync(string arg, CommercePipelineExecutionContext context)
    {
      return Task.FromResult(arg);
    }
    public override Task><string> ContinueTask(string arg, CommercePipelineExecutionContext context)
    {
      return Task.FromResult(arg);
    }
}

Policy trigger conditional blocks

Starting with Sitecore 10.0, all policy trigger conditional blocks must derive from one of the following synchronous or asynchronous pipeline block classes:

  • SyncPolicyTriggerConditionalPipelineBLock

  • AsyncPolicyTriggerConditionalPipelineBLock

Note

A policy trigger block sets a header in the context that stops the block from running. For example, to skip cart calculation in a block, set ShouldNotRunPolicyTrigger to "DoNotCalculateCart".

To run a policy trigger conditional block synchronously, you derive it from the SyncPolicyTriggerConditionalPipelineBLock class. For example:

public class SamplePolicyTriggerConditionalPipelineBlock : PolicyTriggerConditionalPipelineBlock<string, string>
{   
    public override string Run(string arg, CommercePipelineExecutionContext context)
    {
        return arg;
    }
    public override string ShouldNotRunPolicyTrigger => "DoNotRunThis";
}

To run a policy trigger conditional block asynchronously, you derive it from the AsyncPolicyTriggerConditionalPipelineBLock class. For example:

public class SampleAsyncPolicyTriggerConditionalPipelineBlock : AsyncPolicyTriggerConditionalPipelineBlock<string, string>
{   
    public override Task<string> RunAsync(string arg, CommercePipelineExecutionContext context)
    {
        return Task.FromResult(arg);
    }
    public override string ShouldNotRunPolicyTrigger => "DoNotRunThis";
}