EverTask 3.3.0

dotnet add package EverTask --version 3.3.0
                    
NuGet\Install-Package EverTask -Version 3.3.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="EverTask" Version="3.3.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="EverTask" Version="3.3.0" />
                    
Directory.Packages.props
<PackageReference Include="EverTask" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add EverTask --version 3.3.0
                    
#r "nuget: EverTask, 3.3.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package EverTask@3.3.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=EverTask&version=3.3.0
                    
Install as a Cake Addin
#tool nuget:?package=EverTask&version=3.3.0
                    
Install as a Cake Tool

EverTask Logo

Build NuGet NuGet NuGet NuGet NuGet NuGet

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

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>

View Complete Changelog

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.

License

EverTask is licensed under the Apache License 2.0.

See ATTRIBUTION.md for acknowledgements and attributions.


Developed with ❤️ by Giampaolo Gabba

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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