

Overview
EverTask runs background work in your .NET app: fire-and-forget jobs, delayed and scheduled tasks, and recurring schedules. Everything is persisted, so tasks survive a restart.
It runs in-process (no external scheduler, no Windows Service, no separate worker host), and it doesn't poll the database in a loop. An in-memory scheduler drives execution through channels, and persistence happens where it matters: on enqueue, on status changes, and for recovery after a restart.
If you've used MediatR, the request/handler pattern will feel familiar. The difference is that here tasks are persisted, can be isolated across queues, and keep working under load.
Tasks can be CPU-bound or I/O-bound, long- or short-running. Works with ASP.NET Core, Windows Services, or any .NET host.
Key Features
Core execution
- Background execution: fire-and-forget, scheduled, and recurring tasks
- No database polling: the scheduler lives in memory and runs through channels; the database is written, not polled in a loop
- Persistence: tasks resume after a restart (SQL Server, PostgreSQL, SQLite, In-Memory)
- Fluent scheduling: recurring tasks by minute, hour, day, week, month, or cron
- Idempotent registration: a task key keeps duplicate recurring registrations out
Performance & scalability
- Multi-queue: isolate workloads by priority, resource type, or business domain
- Keyed rate limiting: throttle per tenant/account/resource against external API limits, without blocking workers or other keys
- Light scheduler: minimal lock contention, zero CPU when idle
- Sharded scheduler: optional, for high scheduling load
- Lower overhead: reflection caching and lazy serialization
Monitoring
- Dashboard + REST API: an embedded React UI for monitoring and analytics
- Real-time updates: SignalR push with event-driven cache invalidation
- Execution log capture: a proxy logger with optional database persistence and configurable retention
- Audit levels: tune how much audit history you keep, to control table growth
Resilience
- Retry policies: built-in linear retry, custom policies, Polly integration, exception filtering
- Timeouts: global and per-task
Developer experience
- Extensible: custom storage, retry policies, and schedulers
- Serilog integration: structured logging
- Async throughout
- Compile-time payload analyzer: a Roslyn analyzer (ET0001–ET0007) bundled in
EverTask.Abstractions
catches System.Text.Json contract violations in the IDE/build, with code fixes (see below)
Quick Start
Installation
dotnet add package EverTask
dotnet add package EverTask.Storage.SqlServer # Or EverTask.Storage.Postgres / EverTask.Storage.Sqlite
Configuration
// Register EverTask with SQL Server storage
builder.Services.AddEverTask(opt =>
{
opt.RegisterTasksFromAssembly(typeof(Program).Assembly);
})
.AddSqlServerStorage(builder.Configuration.GetConnectionString("EverTaskDb"));
Create Your First Task