Sitecore’s Scheduled Agents and Tasks have been around forever and are well-known members of the XM suite. Less known is a gotcha you might run into when implementing long running operations (i.E. background import/export, bulk updates,…)
Why is that? Scheduled Agents and Tasks all run synchronously unless you tell them not to.
An example
This agent will be executed every 2 hours:
<agent type="MyLongRunningOperation,MyAssembly" method="Run" interval="02:00:00"/>
Code:
public class MyLongRunningOperation { public void Run() { // Do some time consuming things } }
Scheduler will launch the Run() method in a new thread, but it will wait for it to be completed preventing other agents from running until this operation completes.
This can lead to various strange behaviour i.E. a long running operation might never complete because it blocks the Sitecore.Tasks.UrlAgent from keeping your instance alive.
JobManager to the rescue
Case A: Scheduled Agents
A possible workaround might be the following:
public class MyLongRunningOperation { public void Run() { var options = new DefaultJobOptions("MyLongRunningOperation Job", "MyCategory", "my_site", this, "DoTimeConsumingThings"); JobManager.Start(options); } public void DoTimeConsumingThings() { // Do some time consuming things } }
This will call the DoTimeConsumingThings() method in a background job through JobManager. It will be visible as “MyLongRunningOperation Job” on /sitecore/admin/jobs.aspx
The neat thing is: You can forget the workaround above! Just add the async=”true” attribute to your agent configuration and Scheduler will take care of it automatically:
<agent type="MyLongRunningOperation,MyAssembly" method="Run" interval="02:00:00" async="true"/>
This tells Scheduler to not wait for job completion and continue with the other agents.
Case B: Scheduled Tasks
Tasks defined as Sitecore Items have an async checkbox which tells Sitecore.DatabaseAgent to run them as Job.

DatabaseAgent will then launch this command as a background job and you’ll see it appear as ScheduleCommand ‘{item-id-of-command}’ on /sitecore/admin/jobs.aspx
Caveat: Different context
Be aware that the the site context and default device might be different than expected when running asynchronously.
TL;DR
Sitecore Scheduled Agents and Tasks run synchronously unless you explicitly set them to async. You can do this by adding the asnyc=”true” attribute in your agent configuration OR by checking the “Async” checkbox on Scheduled Tasks.