TickerQ 2.2.2-preview
See the version list below for details.
dotnet add package TickerQ --version 2.2.2-preview
NuGet\Install-Package TickerQ -Version 2.2.2-preview
<PackageReference Include="TickerQ" Version="2.2.2-preview" />
<PackageVersion Include="TickerQ" Version="2.2.2-preview" />
<PackageReference Include="TickerQ" />
paket add TickerQ --version 2.2.2-preview
#r "nuget: TickerQ, 2.2.2-preview"
#:package TickerQ@2.2.2-preview
#addin nuget:?package=TickerQ&version=2.2.2-preview&prerelease
#tool nuget:?package=TickerQ&version=2.2.2-preview&prerelease
TickerQ
Robust. Adaptive. Precise.
TickerQ is a fast, reflection-free background task scheduler for .NET — built with source generators, EF Core integration, cron + time-based execution, and a real-time dashboard.
📚 Full Docs: https://tickerq.arcenox.com
Note: As of v2.2.0, all TickerQ packages are versioned together — even if a package has no changes — to keep the ecosystem in sync. Always update all packages to the same version.
✨ Features
- Time and Cron Scheduling
- Stateless Core with source generator
- EF Core Persistence
- Live Dashboard UI
- Retry Policies & Throttling
- Dependency Injection support
- Multi-node distributed coordination
📦 Installation
Core (required)
dotnet add package TickerQ
Entity Framework Integration (optional)
dotnet add package TickerQ.EntityFrameworkCore
Dashboard UI (optional)
dotnet add package TickerQ.Dashboard
⚙️ Basic Setup
In Program.cs or Startup.cs
builder.Services.AddTickerQ(options =>
{
options.SetMaxConcurrency(4); // Optional
options.SetExceptionHandler<MyExceptionHandler>(); // Optional
options.AddOperationalStore<MyDbContext>(efOpt =>
{
efOpt.UseModelCustomizerForMigrations(); // Applies custom model customization only during EF Core migrations
efOpt.CancelMissedTickersOnApplicationRestart(); // Useful in distributed mode
}); // Enables EF-backed storage
options.AddDashboard(basePath: "/tickerq-dashboard"); // Dashboard path
options.AddDashboardBasicAuth(); // Enables simple auth
});
app.UseTickerQ(); // Activates job processor
❗️If Not Using UseModelCustomizerForMigrations()
You must apply TickerQ configurations manually in your DbContext:
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options) { }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Apply TickerQ entity configurations explicitly
builder.ApplyConfiguration(new TimeTickerConfigurations());
builder.ApplyConfiguration(new CronTickerConfigurations());
builder.ApplyConfiguration(new CronTickerOccurrenceConfigurations());
// Alternatively, apply all configurations from assembly:
// builder.ApplyConfigurationsFromAssembly(typeof(TimeTickerConfigurations).Assembly);
}
}
💡 Recommendation:
UseUseModelCustomizerForMigrations()to cleanly separate infrastructure concerns from your core domain model, especially during design-time operations like migrations.
Note: If you're using third-party libraries (e.g., OpenIddict) that also overrideIModelCustomizer, you must either merge customizations or fall back to manual configuration insideOnModelCreating()to avoid conflicts.
Job Definition
1. Cron Job (Recurring)
public class CleanupJobs
{
[TickerFunction(functionName: "CleanupLogs", cronExpression: "0 0 * * *" )]
public void CleanupLogs()
{
// Runs every midnight
}
}
This uses a cron expression to run daily at midnight.
2. One-Time Job (TimeTicker)
public class NotificationJobs
{
[TickerFunction(functionName: "SendWelcome")]
public Task SendWelcome(TickerFunctionContext<string> tickerContext ,CancellationToken ct)
{
Console.WriteLine(tickerContext.Request); // Output: User123
return Task.CompletedTask;
}
}
Then schedule it:
await _timeTickerManager.AddAsync(new TimeTicker
{
Function = "SendWelcome",
ExecutionTime = DateTime.UtcNow.AddMinutes(1),
Request = TickerHelper.CreateTickerRequest<string>("User123"),
Retries = 3,
RetryIntervals = new[] { 30, 60, 120 } // Retry after 30s, 60s, then 2min
});
3. Injecting Services in Jobs (Fully DI Support)
public class ReportJobs
{
private readonly IReportService _reportService;
public ReportJobs(IReportService reportService)
{
_reportService = reportService;
}
[TickerFunction(functionName: "GenerateDailyReport", cronExpression: "0 6 * * *")]
public async Task GenerateDailyReport()
{
await _reportService.GenerateAsync();
}
}
Dashboard UI
Check out Dashboard Overview: TickerQ-Dashboard-Examples
Enabled by adding:
options.AddDashboard(basePath: "/tickerq-dashboard");
options.AddDashboardBasicAuth(); // Optional
Accessible at /tickerq-dashboard, it shows:
- System status
- Active tickers
- Job queue state
- Cron ticker stats
- Execution history
- Trigger/cancel/edit jobs live
Auth config (optional):
"TickerQBasicAuth": {
"Username": "admin",
"Password": "admin"
}
🔐 Retry & Locking
TickerQ supports:
- Retries per job
- Retry intervals (
RetryIntervals) - Distributed locking (EF mode only)
- Job ownership tracking across instances
- Cooldown on job failure
🧪 Advanced: Manual CronTicker Scheduling
await _cronTickerManager.AddAsync(new CronTicker
{
Function = "CleanupLogs",
CronExpression = "0 */6 * * *", // Every 6 hours
Retries = 2,
RetryIntervals = new[] { 60, 300 }
});
🛠️ Developer Tips
- Use
[TickerFunction]to register jobs - Use
FunctionNameconsistently across schedule and handler - Use
CancellationTokenfor graceful cancellation - Use
Requestto pass dynamic data to jobs
🤝 Contribution
PRs, ideas, and issues are welcome!
- Fork & branch
- Code your change
- Submit a Pull Request
📄 License
MIT OR Apache 2.0 © Arcenox
You may choose either license to use this software.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- Microsoft.AspNetCore.Http.Abstractions (>= 2.2.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 2.1.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 2.1.0)
- Microsoft.Extensions.Logging.Abstractions (>= 2.1.0)
- TickerQ.Utilities (>= 2.2.2-preview)
NuGet packages (6)
Showing the top 5 NuGet packages that depend on TickerQ:
| Package | Downloads |
|---|---|
|
ZhileTime.Hope.TickerQ
Package Description |
|
|
Paramore.Brighter.MessageScheduler.TickerQ
TikcerQ integration for Paramore.Brighter Command Processor. Provides advanced message scheduling capabilities using TikcerQ for background job processing, delayed message delivery, and complex recurring task scheduling. |
|
|
Sparkdo.TickerQ
Sparkdo TickerQ 库,提供基于 TickerQ 的定时任务功能集成实现 |
|
|
Sparkdo.BackgroundJobs.TickerQ
Sparkdo TickerQ 后台作业库,提供基于 TickerQ 的后台作业功能集成实现 |
|
|
Sparkdo.BackgroundWorkers.TickerQ
Sparkdo TickerQ 后台工作者库,提供基于 TickerQ 的后台工作者功能集成实现 |
GitHub repositories (2)
Showing the top 2 popular GitHub repositories that depend on TickerQ:
| Repository | Stars |
|---|---|
|
Arcenox-co/TickerQ
TickerQ is a fast, reflection-free background task scheduler for .NET — built with source generators, EF Core integration, cron + time-based execution, and a real-time dashboard.
|
|
|
foxminchan/BookWorm
The practical implementation of Aspire using Microservices, AI-Agents
|
| Version | Downloads | Last Updated |
|---|---|---|
| 10.1.1 | 1,371 | 2/10/2026 |
| 10.1.0 | 509 | 2/9/2026 |
| 10.1.0-beta | 79 | 2/9/2026 |
| 10.0.5.2-beta | 78 | 2/9/2026 |
| 10.0.5.1-beta | 88 | 2/9/2026 |
| 10.0.5-beta | 85 | 2/9/2026 |
| 10.0.4-beta | 90 | 2/9/2026 |
| 10.0.3-beta | 107 | 2/5/2026 |
| 10.0.2 | 34,159 | 12/10/2025 |
| 10.0.1 | 8,367 | 11/27/2025 |
| 9.1.1 | 246 | 2/10/2026 |
| 9.1.0 | 117 | 2/9/2026 |
| 9.1.0-beta | 80 | 2/9/2026 |
| 9.0.2 | 6,085 | 12/10/2025 |
| 8.1.1 | 115 | 2/10/2026 |
| 8.1.0 | 163 | 2/9/2026 |
| 8.1.0-beta | 82 | 2/9/2026 |
| 8.0.2 | 5,488 | 12/10/2025 |
| 8.0.1 | 2,995 | 11/27/2025 |
| 2.2.2-preview | 187 | 6/26/2025 |