TickerQ 2.2.2
dotnet add package TickerQ --version 2.2.2
NuGet\Install-Package TickerQ -Version 2.2.2
<PackageReference Include="TickerQ" Version="2.2.2" />
<PackageVersion Include="TickerQ" Version="2.2.2" />
<PackageReference Include="TickerQ" />
paket add TickerQ --version 2.2.2
#r "nuget: TickerQ, 2.2.2"
#addin nuget:?package=TickerQ&version=2.2.2
#tool nuget:?package=TickerQ&version=2.2.2
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
FunctionName
consistently across schedule and handler - Use
CancellationToken
for graceful cancellation - Use
Request
to 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)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated |
---|---|---|
2.2.2 | 260 | 6/28/2025 |
2.2.2-preview | 118 | 6/26/2025 |
2.2.1 | 261 | 6/24/2025 |
2.2.1-preview-1 | 125 | 6/24/2025 |
2.2.1-preview | 125 | 6/24/2025 |
2.2.0 | 681 | 6/16/2025 |
2.2.0-preview | 133 | 6/17/2025 |
2.1.7-preview | 148 | 6/16/2025 |
2.1.6-preview | 135 | 6/16/2025 |
2.1.5 | 132 | 6/16/2025 |
2.1.3 | 133 | 6/14/2025 |
2.1.1 | 267 | 6/7/2025 |
2.1.0 | 167 | 5/23/2025 |
2.0.1 | 410 | 4/25/2025 |
2.0.0 | 174 | 4/19/2025 |