Rask.Jobs
0.20.0
See the version list below for details.
dotnet add package Rask.Jobs --version 0.20.0
NuGet\Install-Package Rask.Jobs -Version 0.20.0
<PackageReference Include="Rask.Jobs" Version="0.20.0" />
<PackageVersion Include="Rask.Jobs" Version="0.20.0" />
<PackageReference Include="Rask.Jobs" />
paket add Rask.Jobs --version 0.20.0
#r "nuget: Rask.Jobs, 0.20.0"
#:package Rask.Jobs@0.20.0
#addin nuget:?package=Rask.Jobs&version=0.20.0
#tool nuget:?package=Rask.Jobs&version=0.20.0
Rask.Jobs
Durable background jobs for a Rask app — enqueued work that runs off the request thread, stored in the app's own database, with no broker or Redis.
- Mark a type
IJoband it dispatches to an ordinary Rask.CqrsICommandHandler<TJob>— a job is a command executed later. - A background
JobProcessorpolls theJobtable and runs each due job — at-least-once, with exponential-backoff retries up toMaxAttempts(then left as a dead letter for inspection). - Delayed (
ScheduleAsync(job, delay)) and durable interval-recurring (AddRecurring<T>(name, every, …)) jobs — recurring runs are tracked in the DB, so a restart never double-runs them. Read the schedule back fromJobOptions.RecurringJobs. - Metrics on the
Rask.Jobsmeter: processed / failed / dead-lettered counters, a duration histogram, and pending / dead-letter gauges.rask.jobs.deadlettersis the one to alert on. - A source generator registers every
IJobtype for reflection-free rehydration on the run path.
Use
public sealed record SendWelcomeEmail(Guid UserId) : IJob;
public sealed class SendWelcomeEmailHandler(IEmailSender email) : ICommandHandler<SendWelcomeEmail>
{
public Task HandleAsync(SendWelcomeEmail cmd, CancellationToken ct) => email.SendWelcomeAsync(cmd.UserId, ct);
}
// Program.cs
builder.Services.AddRaskCqrs();
builder.Services.AddRaskJobs<AppDbContext>(o =>
o.AddRecurring<PurgeStaleCarts>("purge-carts", every: TimeSpan.FromHours(1), () => new PurgeStaleCarts()));
// AppDbContext.OnModelCreating: modelBuilder.AddRaskJobs();
// then: rask db add AddJobs && rask db update
// enqueue from anywhere IJobQueue is injected:
await jobs.EnqueueAsync(new SendWelcomeEmail(user.Id));
await jobs.ScheduleAsync(new SendReminder(order.Id), delay: TimeSpan.FromHours(24));
Register your context as an IDbContextFactory<AppDbContext> (Rask Server sessions are long-lived).
Several instances is safe: each processor leases the batch it claims, so a job runs on exactly one of
them. On SQLite you will still usually run one, because SQLite is single-writer, so the processor claims
work by polling and writing sequentially. Need a job to commit atomically with a business change? Raise a domain event and deliver it with
Rask.Outbox instead — the two pillars are complementary.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. 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. |
-
net10.0
- Microsoft.EntityFrameworkCore (>= 10.0.10)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.10)
- Rask.Cqrs (>= 0.20.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Rask.Jobs:
| Package | Downloads |
|---|---|
|
Rask.Dashboard
A built-in operator dashboard for the Rask One Person Framework batteries. Mounts at /_ops and shows the outbox, background jobs, queued mail and cache from the application's own database — queue depth, dead letters, the errors behind them, stored email previews, the recurring-job schedule, SQLite pragmas and backup status. A live log tail is built in, and becomes a searchable history when Rask.Logging is installed. Panels appear only for the batteries the app actually registered. Protected by an authorization policy that fails closed outside Development. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.20.1-alpha.0.36 | 2 | 8/10/2026 |
| 0.20.1-alpha.0.18 | 35 | 8/8/2026 |
| 0.20.1-alpha.0.17 | 39 | 8/8/2026 |
| 0.20.1-alpha.0.16 | 36 | 8/8/2026 |
| 0.20.1-alpha.0.15 | 40 | 8/7/2026 |
| 0.20.1-alpha.0.14 | 44 | 8/7/2026 |
| 0.20.1-alpha.0.13 | 42 | 8/7/2026 |
| 0.20.1-alpha.0.12 | 37 | 8/7/2026 |
| 0.20.1-alpha.0.11 | 49 | 8/7/2026 |
| 0.20.1-alpha.0.9 | 35 | 8/7/2026 |
| 0.20.1-alpha.0.8 | 48 | 8/7/2026 |
| 0.20.1-alpha.0.7 | 40 | 8/7/2026 |
| 0.20.1-alpha.0.5 | 43 | 8/7/2026 |
| 0.20.1-alpha.0.4 | 41 | 8/7/2026 |
| 0.20.1-alpha.0.3 | 45 | 8/7/2026 |
| 0.20.1-alpha.0.2 | 42 | 8/6/2026 |
| 0.20.0 | 52 | 8/6/2026 |
| 0.19.1-alpha.0.75 | 40 | 8/6/2026 |
| 0.19.1-alpha.0.74 | 41 | 8/6/2026 |
| 0.19.1-alpha.0.73 | 46 | 8/6/2026 |