---
title: One-Off and Delayed Jobs
description: Enqueue immediate and scheduled runs using the DurableStack client API.
order: 64
---

# One-Off and Delayed Jobs

Use `IDurableStackClient` for ad-hoc and scheduled-once execution.

## Enqueue immediately

```csharp
var runId = await durableClient.EnqueueAsync<SendWelcomeEmailJob>(
    new SendWelcomeEmailArgs { Email = "hello@example.com" },
    cancellationToken);
```

## Schedule for later

```csharp
var runAtUtc = DateTimeOffset.UtcNow.AddMinutes(30);

var runId = await durableClient.ScheduleAsync<SendWelcomeEmailJob>(
    new SendWelcomeEmailArgs { Email = "later@example.com" },
    runAtUtc,
    cancellationToken);
```

## Cancel a run

```csharp
var cancelled = await durableClient.CancelRunAsync(runId, cancellationToken);
```

## Query scheduled and recent runs

```csharp
var recent = await runQueryService.GetRecentRunsAsync(50, cancellationToken);
var pending = await runQueryService.GetRunsByStatusAsync("pending", 50, cancellationToken);
```

## Practical guidance

- Use delayed jobs for time-based follow-up work that is not recurring.
- Keep payload DTOs version-safe and backward-compatible where possible.
- Use run query APIs to verify enqueue/schedule behavior in integration tests.
