Background job scheduling for .NET
One-off and cron jobs with source-generated registration, pluggable persistence and a built-in dashboard.
An independently maintained open-source project with its own roadmap. See Origin.
Documentation · Star · Fork
- Time and cron jobs: schedule one-off jobs at a point in time, or recurring jobs with 6-field (seconds) cron expressions.
- Source-generated registration: job functions are discovered at compile time, with no runtime assembly scanning.
- Pluggable persistence: in-memory, Entity Framework Core (SQL Server, PostgreSQL, SQLite, MySQL, ...), MongoDB or Redis.
- Built-in dashboard: a real-time UI over SignalR to monitor, inspect, run and manage jobs.
- Retries: per-job retry counts and intervals.
- Multiple nodes: lock-based coordination so several instances can share one store.
- OpenTelemetry: optional tracing for job execution.
- .NET 8, 9 and 10 in one package: every package contains a separate build for each target, and NuGet picks the one that matches your project.
dotnet add package SharpTickervar builder = WebApplication.CreateBuilder(args);
builder.Services.AddSharpTicker();
var app = builder.Build();
app.UseSharpTicker();
app.Run();using SharpTicker.Utilities.Base;
public class MyJobs
{
[TickerFunction("HelloWorld")]
public Task HelloWorld(TickerFunctionContext context, CancellationToken cancellationToken)
{
Console.WriteLine($"Hello from SharpTicker! Job ID: {context.Id}");
return Task.CompletedTask;
}
}public class MyService(ITimeTickerManager<TimeTickerEntity> manager)
{
public Task ScheduleAsync() =>
manager.AddAsync(new TimeTickerEntity
{
Function = "HelloWorld",
ExecutionTime = DateTime.UtcNow.AddSeconds(10)
});
}More complete setups are in samples/.
| Package | Description |
|---|---|
SharpTicker |
Scheduler engine (includes the source generator) |
SharpTicker.Utilities |
Shared entities, interfaces and helpers |
SharpTicker.EntityFrameworkCore |
Entity Framework Core persistence |
SharpTicker.MongoDB |
MongoDB persistence |
SharpTicker.Caching.StackExchangeRedis |
Redis persistence and coordination |
SharpTicker.Dashboard |
Real-time dashboard UI |
SharpTicker.Instrumentation.OpenTelemetry |
OpenTelemetry tracing |
SharpTicker.SourceGenerator |
Compile-time job registration (already bundled with SharpTicker) |
All packages share one version number and are released together; keep them on the same version. Each package contains three builds side by side (lib/net8.0, lib/net9.0, lib/net10.0), each compiled against the matching major version of Microsoft.Extensions and Entity Framework Core.
SharpTicker follows Semantic Versioning, with one version line for all packages:
- Major (
2.0.0): breaking changes to the public API, behavior or database schema, and dropping a target framework. - Minor (
1.1.0): new features and new target frameworks. APIs are marked[Obsolete]before they are removed in a later major version. - Patch (
1.0.1): bug and security fixes.
Supported .NET versions. Every 1.x release targets .NET 8, 9 and 10. Microsoft ends support for .NET 8 and .NET 9 on November 10, 2026, but SharpTicker keeps building for them throughout 1.x, so updating SharpTicker never forces you to upgrade .NET within a major version. They will be dropped no earlier than 2.0.0.
Requirements: the .NET 10 SDK (pinned in global.json), plus the .NET 8 and 9 runtimes to run the tests on every target. Node.js 20+ is only needed for the dashboard UI; without it the libraries still build and test.
# Dashboard UI (embedded into SharpTicker.Dashboard)
cd src/SharpTicker.Dashboard/wwwroot
npm ci
npm run build
cd ../../..
dotnet build SharpTicker.slnx -c Release
dotnet test SharpTicker.slnx -c ReleaseDocumentation: msx752.github.io/SharpTicker. Its source is in docs/.
Issues and pull requests are welcome. See CONTRIBUTING.md.
SharpTicker began as a fork of the MIT/Apache-2.0 dual-licensed TickerQ, based on commit 3acd0f314a351817a3159d7d29a3798c8612a263 (2026-07-05), and has been modified since. The original copyright notices are retained in LICENSE.
SharpTicker 1.0.0 corresponds to TickerQ 10.4.0, the last release published under MIT/Apache-2.0, plus the changes merged after it up to the base commit above: the MongoDB persistence provider, tracing diagnostics moved into the main package, and an OpenTelemetry security update. It contains no code from later TickerQ releases.
The fork is where SharpTicker starts, not what it intends to stay. Version 1.0.0 is the one release built to match its origin, so existing users have a clear and predictable way across. From there on, SharpTicker is its own project: it is maintained independently, follows its own roadmap and release cycle, and makes its own design decisions.
In practice this means:
- Divergence is expected. APIs, behavior and storage will evolve on their own terms after 1.0.0. Breaking changes follow Semantic Versioning and are announced in the release notes.
- No tracking of the original project. Changes made there are not followed, mirrored or ported, and SharpTicker makes no compatibility promise beyond 1.0.0.
- No affiliation. SharpTicker is not affiliated with, endorsed by or supported by the original authors. Please report SharpTicker issues here, not upstream.
Moving from TickerQ? Follow the migration guide.
Dual-licensed under the MIT License or the Apache License 2.0, at your option.