EverTask 3.3.0
dotnet add package EverTask --version 3.3.0
NuGet\Install-Package EverTask -Version 3.3.0
<PackageReference Include="EverTask" Version="3.3.0" />
<PackageVersion Include="EverTask" Version="3.3.0" />
<PackageReference Include="EverTask" />
paket add EverTask --version 3.3.0
#r "nuget: EverTask, 3.3.0"
#:package EverTask@3.3.0
#addin nuget:?package=EverTask&version=3.3.0
#tool nuget:?package=EverTask&version=3.3.0

Overview
EverTask is a high-performance .NET library for background task execution. It handles everything from simple fire-and-forget operations to complex recurring schedules, with persistence that survives application restarts.
Supports CPU-intensive, I/O-bound, long-running and short-running tasks. No external schedulers or Windows Services required — everything runs in-process with your application.
If you've used MediatR, you'll feel right at home with the request/handler pattern — but with built-in persistence, multi-queue isolation, and the ability to scale to high load.
Works great with ASP.NET Core, Windows Services, or any .NET project that needs reliable background processing.
Key Features
Core Execution
- Background Execution — Fire-and-forget, scheduled, and recurring tasks with elegant API
- Smart Persistence — Tasks resume after application restarts (SQL Server, SQLite, In-Memory)
- Fluent Scheduling API — Intuitive recurring task configuration (every minute, hour, day, week, month, cron)
- Idempotent Task Registration — Prevent duplicate recurring tasks with unique keys
Performance & Scalability
- Multi-Queue Support — Isolate workloads by priority, resource type, or business domain
- High-Performance Scheduler — Minimal lock contention and zero CPU when idle
- High Load Support — Optional sharded scheduler for high-loading scheduling scenarios
- Optimized Performance — Reflection caching, lazy serialization, optimized database operations
Monitoring & Observability
- Web Dashboard + REST API — Embedded React UI for monitoring, analytics, and observability
- Real-Time Updates — SignalR live monitoring with event-driven cache invalidation
- Task Execution Log Capture — Proxy logger with optional database persistence for audit trails
- Configurable Audit Levels — Control database bloat with granular audit trail settings
Resilience & Error Handling
- Powerful Retry Policies — Built-in linear retry, custom policies, Polly integration, exception filtering
- Timeout Management — Global and per-task timeout configuration
Developer Experience
- Extensible Architecture — Custom storage, retry policies, and schedulers
- Serilog Integration — Detailed structured logging
- Async All The Way — Fully asynchronous for maximum scalability
<img src="assets/screenshots/4.png" style="width:100%;max-width:900px;display: block; margin:20px auto;" alt="Task Details" />
Quick Start
Installation
dotnet add package EverTask
dotnet add package EverTask.Storage.SqlServer # Or 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
Define a task request:
public record SendWelcomeEmailTask(string UserEmail, string UserName) : IEverTask;
Create a handler:
public class SendWelcomeEmailHandler : EverTaskHandler<SendWelcomeEmailTask>
{
private readonly IEmailService _emailService;
public SendWelcomeEmailHandler(IEmailService emailService)
{
_emailService = emailService;
}
public override async Task Handle(SendWelcomeEmailTask task, CancellationToken cancellationToken)
{
Logger.LogInformation("Sending welcome email to {Email}", task.UserEmail);
await _emailService.SendWelcomeEmailAsync(
task.UserEmail,
task.UserName,
cancellationToken);
}
}
Dispatch the task:
// Send welcome email in background
await _dispatcher.Dispatch(new SendWelcomeEmailTask(dto.Email, dto.Name));
Documentation
📚 Full Documentation - Complete guides, tutorials, and API reference
Quick Links
- Getting Started - Installation, configuration, and your first task
- Task Creation - Requests, handlers, lifecycle hooks, and best practices
- Task Dispatching - Fire-and-forget, delayed, and scheduled tasks
- Recurring Tasks - Fluent scheduling API, cron expressions, idempotent registration
- Resilience & Error Handling - Retry policies, timeouts, CancellationToken usage
- Monitoring - Complete monitoring guide (Dashboard, Events, and Logs)
- Scalability - Multi-queue support and sharded scheduler for high-load scenarios
- Task Orchestration - Chain tasks, build workflows, and coordinate complex processes
- Storage Configuration - SQL Server, SQLite, In-Memory, custom implementations
- Configuration - Configure EverTask (Reference + Cheatsheet)
- Architecture & Internals - How EverTask works under the hood
Showcase: Powerful Features
Fluent Recurring Scheduler
Schedule recurring tasks with an intuitive, type-safe API:
// Run every day at 3 AM
await dispatcher.Dispatch(
new DailyCleanupTask(),
builder => builder.Schedule().EveryDay().AtTime(new TimeOnly(3, 0)));
// Run every Monday, Wednesday, Friday at 9 AM
var days = new[] { DayOfWeek.Monday, DayOfWeek.Wednesday, DayOfWeek.Friday };
await dispatcher.Dispatch(
new BackupTask(),
builder => builder.Schedule().EveryWeek().OnDays(days).AtTime(new TimeOnly(9, 0)))).RunUntil(DateTimeOffset.UtcNow.AddDays(30)));
Multi-Queue Workload Isolation
Keep critical tasks separate from heavy background work:
// High-priority queue for critical operations
.AddQueue("critical", q => q
.SetMaxDegreeOfParallelism(20)
.SetChannelCapacity(500)
.SetDefaultTimeout(TimeSpan.FromMinutes(2)))
Smart Retry Policies with Exception Filtering
Control which exceptions trigger retries to fail-fast on permanent errors:
// Predefined sets for common scenarios
RetryPolicy => new LinearRetryPolicy(5, TimeSpan.FromSeconds(2)).HandleTransientDatabaseErrors();
// Whitelist: Only retry specific exceptions (you can also use DoNotHandle for blacklist)
RetryPolicy = new LinearRetryPolicy(3, TimeSpan.FromSeconds(1)).Handle<DbException>().Handle<HttpRequestException>();
// Predicate: Custom logic (e.g., HTTP 5xx only)
RetryPolicy = new LinearRetryPolicy(3, TimeSpan.FromSeconds(1)).HandleWhen(ex => ex is HttpRequestException httpEx && httpEx.StatusCode >= 500);
Idempotent Task Registration
Use unique keys to safely register recurring tasks at startup without creating duplicates:
// Register recurring tasks - safe to call on every startup
await _dispatcher.Dispatch(
new DailyCleanupTask(),
r => r.Schedule().EveryDay().AtTime(new TimeOnly(3, 0)),
taskKey: "daily-cleanup"); // Won't create duplicates
Monitoring Dashboard
Monitor your tasks with a feature-complete web dashboard providing real-time insights, comprehensive analytics, and detailed observability:
Dashboard Preview:
<div align="center"> <table> <tr> <td align="center" width="20%"> <img src="assets/screenshots/1.png" width="100%" alt="Dashboard Overview" /> <br /> <em>Dashboard Overview</em> </td> <td align="center" width="20%"> <img src="assets/screenshots/3.png" width="100%" alt="Task List" /> <br /> <em>Task List with Filters</em> </td> <td align="center" width="20%"> <img src="assets/screenshots/4.png" width="100%" alt="Task Details" /> <br /> <em>Task Details & History</em> </td> <td align="center" width="20%"> <img src="assets/screenshots/6.png" width="100%" alt="Execution Logs" /> <br /> <em>Execution Logs Viewer</em> </td> <td align="center" width="20%"> <img src="assets/screenshots/8.png" width="100%" alt="Execution Logs" /> <br /> <em>Realtime flow</em> </td> </tr> </table>
📸 View all 10 screenshots in the documentation
</div>
Task Execution Log Capture
Capture all logs written during task execution and persist them to the database for debugging and auditing:
<img src="assets/screenshots/4.png" style="width:100%;max-width:900px;display: block; margin:20px auto;" alt="Task Details" /> <br /> <em>View logs in dashboard or retrieve via storage</em>
Quick Links
📦 NuGet Packages
- EverTask - Core library
- EverTask.Abstractions - Lightweight interfaces package
- EverTask.Storage.SqlServer - SQL Server storage
- EverTask.Storage.Sqlite - SQLite storage
- EverTask.Logging.Serilog - Serilog integration
- EverTask.Monitor.AspnetCore.SignalR - Real-time monitoring
📝 Resources
- Changelog - Version history and release notes
- Attribution - Acknowledgements and license information
- GitHub Repository - Source code and issues
- Examples - Sample applications (ASP.NET Core, Console)
Roadmap
We have some exciting features in the pipeline:
- Task Management API: REST endpoints for stopping, restarting, and canceling tasks via the dashboard
- Distributed Clustering: Multi-server task distribution with leader election and automatic failover
- Advanced Throttling: Rate limiting and adaptive throttling based on system resources
- Workflow Orchestration: Complex workflow and saga orchestration with fluent API
- Additional Monitoring: Sentry Crons, Application Insights, OpenTelemetry support
- More Storage Options: PostgreSQL, MySQL, Redis, Cosmos DB
Contributing
Contributions are welcome! Bug reports, feature requests, and pull requests all help make EverTask better.
- Report issues: https://github.com/GiampaoloGabba/EverTask/issues
- Contribute code: https://github.com/GiampaoloGabba/EverTask/pulls
License
EverTask is licensed under the Apache License 2.0.
See ATTRIBUTION.md for acknowledgements and attributions.
Developed with ❤️ by Giampaolo Gabba
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0 is compatible. 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 is compatible. 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 is compatible. 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 is compatible. 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. |
-
net6.0
- Cronos (>= 0.11.1)
- EverTask.Abstractions (>= 3.3.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 7.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 7.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 7.0.0)
- Microsoft.Extensions.Logging (>= 7.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 7.0.1)
- Newtonsoft.Json (>= 13.0.4)
- UUIDNext (>= 4.2.2)
-
net7.0
- Cronos (>= 0.11.1)
- EverTask.Abstractions (>= 3.3.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 7.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 7.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 7.0.0)
- Microsoft.Extensions.Logging (>= 7.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 7.0.1)
- Newtonsoft.Json (>= 13.0.4)
- UUIDNext (>= 4.2.2)
-
net8.0
- Cronos (>= 0.11.1)
- EverTask.Abstractions (>= 3.3.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Logging (>= 8.0.1)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.3)
- Newtonsoft.Json (>= 13.0.4)
- UUIDNext (>= 4.2.2)
-
net9.0
- Cronos (>= 0.11.1)
- EverTask.Abstractions (>= 3.3.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 9.0.10)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.10)
- Microsoft.Extensions.Hosting.Abstractions (>= 9.0.10)
- Microsoft.Extensions.Logging (>= 9.0.10)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.10)
- Newtonsoft.Json (>= 13.0.4)
- UUIDNext (>= 4.2.2)
NuGet packages (6)
Showing the top 5 NuGet packages that depend on EverTask:
| Package | Downloads |
|---|---|
|
EverTask.Monitor.AspnetCore.SignalR
Easy background task with persistence for ASP.NET Core |
|
|
EverTask.Storage.EfCore
Easy background task with persistence for ASP.NET Core |
|
|
EverTask.Logging.Serilog
Easy background task with persistence for ASP.NET Core |
|
|
EverTask.Storage.SqlServer
Easy background task with persistence for ASP.NET Core |
|
|
EverTask.Storage.Sqlite
Easy background task with persistence for ASP.NET Core |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.3.0 | 105 | 11/7/2025 |
| 3.2.0 | 229 | 11/4/2025 |
| 3.1.2 | 284 | 11/2/2025 |
| 3.1.1 | 217 | 11/1/2025 |
| 3.0.0 | 278 | 10/19/2025 |
| 2.0.0 | 276 | 10/19/2025 |
| 1.5.4 | 359 | 5/31/2024 |
| 1.5.3 | 312 | 5/23/2024 |
| 1.5.2 | 332 | 4/9/2024 |
| 1.5.1 | 558 | 11/23/2023 |
| 1.5.0 | 299 | 11/21/2023 |
| 1.4.1 | 308 | 11/19/2023 |
| 1.4.0 | 265 | 11/19/2023 |
| 1.3.0 | 284 | 11/19/2023 |
| 1.2.0 | 279 | 11/17/2023 |
| 1.1.0 | 256 | 11/16/2023 |
| 1.0.4-beta | 93 | 11/13/2023 |
| 1.0.3-beta | 88 | 11/13/2023 |
| 1.0.0 | 256 | 11/15/2023 |