Mediarq.Deferred
1.5.1
dotnet add package Mediarq.Deferred --version 1.5.1
NuGet\Install-Package Mediarq.Deferred -Version 1.5.1
<PackageReference Include="Mediarq.Deferred" Version="1.5.1" />
<PackageVersion Include="Mediarq.Deferred" Version="1.5.1" />
<PackageReference Include="Mediarq.Deferred" />
paket add Mediarq.Deferred --version 1.5.1
#r "nuget: Mediarq.Deferred, 1.5.1"
#:package Mediarq.Deferred@1.5.1
#addin nuget:?package=Mediarq.Deferred&version=1.5.1
#tool nuget:?package=Mediarq.Deferred&version=1.5.1
Mediarq.Deferred
In-process deferred dispatch: SendLaterAsync/PublishLaterAsync queue a command or notification on a
System.Threading.Channels-backed background worker instead of running its handler(s) inline —
decoupling the caller from handler execution time. No external dependency, no persistent store: fills the
gap between immediate Send/Publish and durable scheduling (Mediarq.Hangfire/Mediarq.Quartz) for
the simple "reliable in-process fire-and-forget" case.
dotnet add package Mediarq.Deferred
Usage
builder.Services.AddMediarqDeferredDispatch();
public sealed class OrdersController(IDeferredDispatcher deferred)
{
public async Task<IActionResult> Post(CreateOrder command)
{
await deferred.SendLaterAsync(command); // returns immediately; a background worker dispatches it
return Accepted();
}
}
PublishLaterAsync works the same way for notifications:
await deferred.PublishLaterAsync(new OrderPlaced(orderId));
Both queue a closure capturing the concrete request; a single background worker (DeferredDispatchHostedService)
drains the queue, running each item through the real ISender/IPublisher pipeline (validation, other
behaviors, handlers) in its own DI scope. An exception in one item is logged and does not stop the worker
from processing the next one.
What "reliable" means here
Queued work is in-memory only — it does not survive a process crash or restart. What it does guarantee
is a graceful drain: on a normal host shutdown, the worker stops accepting new work and finishes everything
already queued (bounded by the host's own shutdown timeout) instead of dropping it. If you need the item to
survive a crash, or to run at a specific future time / on a cron schedule, use Mediarq.Hangfire or
Mediarq.Quartz instead.
Backpressure
By default the queue is unbounded. Cap it with AddMediarqDeferredDispatch(o => { o.Capacity = 1000; o.FullMode = BoundedChannelFullMode.Wait; })
to apply backpressure to callers once full — see System.Threading.Channels.BoundedChannelFullMode for the
other modes (DropOldest, DropNewest, DropWrite).
Learn more
Wiring extensions · Full README
MIT © Nicolas Rouffart
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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 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
- Mediarq.Core (>= 1.5.1)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.1)
-
net8.0
- Mediarq.Core (>= 1.5.1)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.1)
-
net9.0
- Mediarq.Core (>= 1.5.1)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.