Soenneker.Utils.BackgroundQueue
4.0.2451
Prefix Reserved
See the version list below for details.
dotnet add package Soenneker.Utils.BackgroundQueue --version 4.0.2451
NuGet\Install-Package Soenneker.Utils.BackgroundQueue -Version 4.0.2451
<PackageReference Include="Soenneker.Utils.BackgroundQueue" Version="4.0.2451" />
<PackageVersion Include="Soenneker.Utils.BackgroundQueue" Version="4.0.2451" />
<PackageReference Include="Soenneker.Utils.BackgroundQueue" />
paket add Soenneker.Utils.BackgroundQueue --version 4.0.2451
#r "nuget: Soenneker.Utils.BackgroundQueue, 4.0.2451"
#:package Soenneker.Utils.BackgroundQueue@4.0.2451
#addin nuget:?package=Soenneker.Utils.BackgroundQueue&version=4.0.2451
#tool nuget:?package=Soenneker.Utils.BackgroundQueue&version=4.0.2451
Soenneker.Utils.BackgroundQueue
A high-performance background Task / ValueTask queue
Overview
BackgroundQueue provides a fast, controlled way to execute background work in .NET applications.
It prevents overload by queueing and processing work asynchronously with configurable limits and built-in tracking.
Features
- Supports both
TaskandValueTask - Configurable queue size
- Tracks running and pending work
- Simple DI registration
- Hosted service for automatic background processing
Installation
dotnet add package Soenneker.Utils.BackgroundQueue
Register the queue:
void ConfigureServices(IServiceCollection services)
{
services.AddBackgroundQueueAsSingleton();
}
Starting & Stopping
Start
await serviceProvider.WarmupAndStartBackgroundQueue(cancellationToken);
Synchronous start:
serviceProvider.WarmupAndStartBackgroundQueueSync(cancellationToken);
Stop
await serviceProvider.StopBackgroundQueue(cancellationToken);
Synchronous stop:
serviceProvider.StopBackgroundQueueSync(cancellationToken);
Configuration
{
"Background": {
"QueueLength": 5000,
"LockCounts": false,
"Log": false
}
}
QueueLength� Maximum number of queued itemsLockCounts� Enables thread-safe tracking of running workLog� Enables debug logging
Using the Queue
Inject IBackgroundQueue:
IBackgroundQueue _queue;
void MyClass(IBackgroundQueue queue)
{
_queue = queue;
}
Queueing a ValueTask
await _queue.QueueValueTask(_ => someValueTask(), cancellationToken);
Queueing a Task
await _queue.QueueTask(_ => someTask(), cancellationToken);
?? Performance Tip: Prefer Stateful Queueing
Avoid capturing variables in lambdas when queueing work. Captured lambdas allocate and can impact performance under load.
? Avoid (captures state)
await _queue.QueueTask(ct => DoWorkAsync(id, ct));
If id is a local variable, this creates a closure.
? Recommended: Pass State Explicitly
Use the stateful overloads with static lambdas.
ValueTask
await _queue.QueueValueTask(
myService,
static (svc, ct) => svc.ProcessAsync(ct),
ct);
Task
await _queue.QueueTask(
(logger, id),
static (s, ct) => s.logger.RunAsync(s.id, ct),
ct);
Why this is better:
- No closure allocations
- Lower GC pressure
- Best performance for high-throughput queues
The non-stateful overloads remain available for convenience, but stateful queueing is recommended for hot paths.
Waiting for the Queue to Empty
await queue.WaitUntilEmpty(cancellationToken);
Task Tracking
Check if work is still processing:
bool isProcessing = await queueInformationUtil.IsProcessing(cancellationToken);
Get current counts:
var (taskCount, valueTaskCount) =
await queueInformationUtil.GetCountsOfProcessing(cancellationToken);
| 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.Extensions.Hosting.Abstractions (>= 10.0.11)
- Soenneker.Asyncs.Locks (>= 4.0.68)
- Soenneker.Extensions.Configuration (>= 4.0.858)
- Soenneker.Extensions.Double (>= 4.0.464)
- Soenneker.Extensions.MethodInfo (>= 4.0.369)
- Soenneker.Extensions.ValueTask (>= 4.0.118)
- Soenneker.Utils.Delay (>= 4.0.78)
NuGet packages (7)
Showing the top 5 NuGet packages that depend on Soenneker.Utils.BackgroundQueue:
| Package | Downloads |
|---|---|
|
Soenneker.Redis.Util
The general purpose utility library leveraging Redis for all of your caching needs |
|
|
Soenneker.Tests.FixturedUnit
A fundamental xUnit test that stores UnitFixture and provides synthetic inversion of control |
|
|
Soenneker.Cosmos.Repository
A data persistence abstraction layer for Cosmos DB |
|
|
Soenneker.ServiceBus.Transmitter
A utility library for sending Service Bus messages |
|
|
Soenneker.Tests.HostedUnit
A fundamental test that stores the TestHost and provides synthetic inversion of control |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.0.2540 | 3,178 | 10/15/2026 |
| 4.0.2539 | 8,180 | 10/14/2026 |
| 4.0.2538 | 113 | 10/14/2026 |
| 4.0.2537 | 2,415 | 10/14/2026 |
| 4.0.2529 | 3,695 | 10/13/2026 |
| 4.0.2526 | 94 | 10/13/2026 |
| 4.0.2523 | 26,482 | 10/11/2026 |
| 4.0.2522 | 88 | 10/11/2026 |
| 4.0.2520 | 90 | 10/11/2026 |
| 4.0.2518 | 92 | 10/11/2026 |
| 4.0.2517 | 25,222 | 10/9/2026 |
| 4.0.2516 | 20,091 | 10/1/2026 |
| 4.0.2515 | 21,643 | 9/25/2026 |
| 4.0.2514 | 1,616 | 9/25/2026 |
| 4.0.2513 | 3,813 | 9/24/2026 |
| 4.0.2512 | 100 | 9/24/2026 |
| 4.0.2511 | 745 | 9/24/2026 |
| 4.0.2510 | 4,743 | 9/24/2026 |
| 4.0.2509 | 19,581 | 9/16/2026 |
| 4.0.2451 | 8,696 | 8/22/2026 |
Update dependency Soenneker.Extensions.Configuration to 4.0.858 (#3183)