RecurrentTasks for .NET allows you to run simple recurrent background tasks with specific intervals, without complex frameworks, persistance, etc...
$ dotnet add package RecurrentTasksThis lightweight library allows you to run simple background tasks with specified intervals in your ASP.NET application.
Each task is a separate Task, which sleeps in background for a while, wakes up, perform some job and sleeps again.
Ideal, when you don't need to run many/heavy tasks and don't want to use "big" solutions with persistence and other bells and whistles.
Optimized for NET 8.0 and later (use v5.0.0 release if you need support for ASP.NET 5, ASP.NET Core 1.0 and 2.0; or v6.6.0 release for net7, net6 or netstandard2.0).
net10.0 and net8.0 (use older versions for previous frameworks);IHostedService implemented for NET Core 2.0 (and above) app lifetime supportRunStatus property contains:
public class MyFirstTask : IRunnable
{
private ILogger logger;
public MyFirstTask(ILogger<MyFirstTask> logger)
{
this.logger = logger;
}
public Task RunAsync(ITask currentTask, IServiceProvider scopeServiceProvider, CancellationToken cancellationToken)
{
// Place your code here
}
}
You can add any parameters to constructor, while they are resolvable from DI container (including scope-lifetime services, because new scope is created for every task run).
By default, new instance of IRunnable is created for every task run, but you may change lifetime in AddTask (see below). Use IServiceProvider passed to RunAsync to obtain scope-wide services if you force your task be singleton.
Startup.cspublic void ConfigureServices(IServiceCollection services)
{
...
services.AddTask<MyFirstTask>(o => o.AutoStart(TimeSpan.FromMinutes(5)));
...
}
And voila! Your task will run every 5 minutes. Until your application ends, of course.
AddTask adds your MyFirstTask to DI container with transient lifetime (new instance will be created for every task run). Pass desired lifetime to AddTask() to override:
services.AddTask<MyFirstTask>(
o => o.AutoStart(TimeSpan.FromMinutes(5)),
ServiceLifetime.Singleton)`.
Anywhere in you app:
// obtain reference to your task
var myTask = serviceProvider.GetService<ITask<MyFirstTask>>();
// poke it
if (myTask.IsStarted)
{
myTask.TryRunImmediately();
}
Use NuGet package RecurrentTasks
All above: versions 8.0.0 or 10.0.0 (depending on your target framework).
Tests can be run with dotnet test.