ReactiveLock.Distributed.Redis 0.0.15

There is a newer version of this package available.
See the version list below for details.
dotnet add package ReactiveLock.Distributed.Redis --version 0.0.15
                    
NuGet\Install-Package ReactiveLock.Distributed.Redis -Version 0.0.15
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ReactiveLock.Distributed.Redis" Version="0.0.15" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ReactiveLock.Distributed.Redis" Version="0.0.15" />
                    
Directory.Packages.props
<PackageReference Include="ReactiveLock.Distributed.Redis" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ReactiveLock.Distributed.Redis --version 0.0.15
                    
#r "nuget: ReactiveLock.Distributed.Redis, 0.0.15"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ReactiveLock.Distributed.Redis@0.0.15
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ReactiveLock.Distributed.Redis&version=0.0.15
                    
Install as a Cake Addin
#tool nuget:?package=ReactiveLock.Distributed.Redis&version=0.0.15
                    
Install as a Cake Tool

ReactiveLock

ReactiveLock is a .NET 9 library for reactive, distributed lock coordination. It allows multiple application instances to track busy/idle state and react to state changes using async handlers.

It supports both in-process and distributed synchronization. Redis is the default distributed backend.

Packages

Package Description
ReactiveLock.Core Core abstractions and in-process lock coordination
ReactiveLock.DependencyInjection Adds DI and named resolution for distributed backends
ReactiveLock.Distributed.Redis Redis-based distributed lock synchronization

Use only ReactiveLock.Core if you don't need distributed coordination.

Installation

In-process only:

dotnet add package ReactiveLock.Core

Distributed with Redis:

dotnet add package ReactiveLock.Core
dotnet add package ReactiveLock.DependencyInjection
dotnet add package ReactiveLock.Distributed.Redis

Usage

Local-only (in-process)

using MichelOliveira.Com.ReactiveLock.Core;

var state = new ReactiveLockTrackerState();
await state.SetLocalStateBlockedAsync();

var tasks = Enumerable.Range(1, 3).Select(i =>
    Task.Run(async () => {
        Console.WriteLine($"[Task {i}] Waiting...");
        await state.WaitIfBlockedAsync();
        Console.WriteLine($"[Task {i}] Proceeded.");
    })
).ToArray();

await Task.Delay(1000);
await state.SetLocalStateUnblockedAsync();
await Task.WhenAll(tasks);

Console.WriteLine("Done.");

Increment / Decrement

var state = new ReactiveLockTrackerState();
var controller = new ReactiveLockTrackerController(state);

await controller.IncrementAsync();
await Task.Delay(300);
await controller.DecrementAsync();

Distributed HTTP Client Request Counter (Redis)

Setup

builder.Services.InitializeDistributedRedisReactiveLock(Dns.GetHostName());
builder.Services.AddDistributedRedisReactiveLock("http");
builder.Services.AddTransient<CountingHandler>();

builder.Services.AddHttpClient("http", client =>
    client.BaseAddress = new Uri(builder.Configuration.GetConnectionString("http")!))
    .AddHttpMessageHandler<CountingHandler>();

var app = builder.Build();
await app.UseDistributedRedisReactiveLockAsync();

CountingHandler

public class CountingHandler : DelegatingHandler
{
    private readonly IReactiveLockTrackerController _controller;

    public CountingHandler(IReactiveLockTrackerFactory factory)
    {
        _controller = factory.GetTrackerController("http");
    }

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        await _controller.IncrementAsync();
        try
        {
            return await base.SendAsync(request, cancellationToken);
        }
        finally
        {
            await _controller.DecrementAsync();
        }
    }
}

Expected Behavior

  • Each HTTP request increments the "http" lock counter.
  • On response, the counter is decremented.
  • Lock state is shared across all application instances.
  • You can use the lock state to:
    • Check if any requests are active.
    • Wait for all requests to complete.

Use Case Example

var state = factory.GetTrackerState("http");

if (await state.IsBlockedAsync())
{
    Console.WriteLine("HTTP requests active.");
}

await state.WaitIfBlockedAsync();
Console.WriteLine("No active HTTP requests.");

Requirements

  • .NET 9 SDK

License

MIT © Michel Oliveira

Product Compatible and additional computed target framework versions.
.NET 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 was computed.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.0.21 393 7/30/2025
0.0.20 91 7/30/2025
0.0.19 112 7/29/2025
0.0.17 90 7/29/2025
0.0.16 83 7/29/2025
0.0.15 172 7/26/2025
0.0.13 139 7/26/2025
0.0.12 203 7/26/2025
0.0.11 275 7/25/2025
0.0.9 279 7/25/2025
0.0.8 294 7/25/2025
0.0.7 297 7/25/2025
0.0.6 304 7/25/2025
0.0.5 321 7/25/2025
0.0.4 321 7/25/2025
0.0.3 318 7/25/2025
0.0.2 327 7/25/2025
0.0.1 325 7/25/2025