TickerQTickerQ

What is TickerQ?

Architecture, philosophy, and how TickerQ compares to other .NET job schedulers.

TickerQ is a background job scheduler for .NET that uses C# source generators to wire up job handlers at compile time. No reflection, no runtime code generation, full Native AOT compatibility.

Why TickerQ?

Most .NET job schedulers rely on runtime reflection to discover and invoke job handlers. This works, but it means:

  • Slower startup — scanning assemblies at boot
  • No AOT support — reflection is incompatible with Native AOT trimming
  • Runtime failures — misspelled function names fail at execution, not at compile time

TickerQ eliminates all of this. The source generator discovers [TickerFunction] methods during compilation and generates the wiring code. If a function name is wrong, you get a compile error, not a runtime surprise.

How it works

[TickerFunction("send-email")]     ──→  Source Generator  ──→  Compiled registration
public async Task SendEmail(...)         (build time)          (zero reflection)
  1. You decorate methods with [TickerFunction] or register them via MapTicker<T>()
  2. At build time, the source generator creates factory code that resolves your classes from DI and invokes the correct method
  3. At runtime, the scheduler polls the persistence store for due jobs and dispatches them to a custom task scheduler
  4. Jobs run on a configurable thread pool with priority support (LongRunning gets its own thread)

Two job types

TimeTickerCronTicker
FiresOnce at a specific timeRepeatedly on a cron schedule
Use caseDelayed tasks, event-driven workPeriodic reports, syncs, cleanup
ChildrenSupports parent-child chainingNo chaining

Persistence options

By default, jobs live in memory. For production, plug in a persistence provider:

ProviderPackageBest for
In-memoryincludedDevelopment, testing
SQL (EF Core)TickerQ.EntityFrameworkCoreSingle-node or multi-node with SQL
RedisTickerQ.Caching.StackExchangeRedisHigh throughput, multi-node

All providers implement the same interface — swap with one line of config.

Ecosystem

PackagePurpose
TickerQCore scheduler, source generator, task pool
TickerQ.EntityFrameworkCoreSQL persistence (SQL Server, PostgreSQL, SQLite)
TickerQ.Caching.StackExchangeRedisRedis persistence + multi-node coordination
TickerQ.DashboardReal-time Vue.js web UI for monitoring
TickerQ.Instrumentation.OpenTelemetryDistributed tracing + structured logging

How it compares

FeatureTickerQHangfireQuartz.NET
AOT supportNative AOT readyNoNo
DiscoverySource generator (compile time)Reflection (runtime)Reflection (runtime)
Cron jobs5/6-part expressionsCron + recurringCron
Job chainingBuilt-in (parent/child)ContinuationsListeners
DashboardBuilt-in (Vue.js + SignalR)Built-inNone (third-party)
PersistenceEF Core, Redis, in-memorySQL Server, RedisADO.NET
Open sourceYesPartial (Pro features)Yes

On this page