Run your first job.

Start with .NET 10 and Redis 6.0.9 or newer.

1. Create an app

dotnet new web -n FlywheelExample
cd FlywheelExample
dotnet add package Soenneker.Flywheel.Core
dotnet add package Soenneker.Flywheel.Redis
dotnet add package Soenneker.Flywheel.Generators

Add PrivateAssets="all" to the Generators package reference in your project file. Start Redis at localhost:6379, or update the connection string below.

2. Define and enqueue a job

Replace Program.cs with:

using Soenneker.Flywheel.Core.Attributes;
using Soenneker.Flywheel.Core.Registrars;
using Soenneker.Flywheel.Core.Services.Abstract;
using Soenneker.Flywheel.Generated;
using Soenneker.Flywheel.Redis;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddFlywheel(options => options.Workers = 4)
    .AddRedis(options => options.ConnectionString = "localhost:6379")
    .AddGeneratedJobs();

var app = builder.Build();
var client = app.Services.GetRequiredService<IJobClient>();

await client.Enqueue(FlywheelJobs.MessageJobs_Write,
    new Message("Hello from Flywheel"));

await app.RunAsync();

public sealed record Message(string Text);

public sealed class MessageJobs(ILogger<MessageJobs> logger)
{
    [FlywheelJob("message.write.v1")]
    public Task Write(Message message, CancellationToken cancellationToken)
    {
        logger.LogInformation("{Message}", message.Text);
        return Task.CompletedTask;
    }
}

The source generator creates FlywheelJobs and typed invokers at build time. Dispatch calls your job method directly, without runtime reflection.

3. Run it

dotnet run

Look for “Hello from Flywheel” in the console. Enqueue saves the job to Redis; a background worker executes it. In your application services, inject IJobClient to submit work.

Jobs can run more than once. Make handlers safe to retry and pass cancellation tokens through to async work.

Next steps

Add the dashboard to search jobs and inspect executions, or see scheduling and recurring jobs.