A simple C#/.NET distributed lease/lock manager (DLM) implementation.
Inspired by the https://github.com/fbeltrao/azfunctions-distributed-locking
-
Install one of the lease storage implementations by following their README instructions:
- Azure Blob Storage
- Azure Cosmos DB
- Entity Framework Core (any database provider supported by the EF Core)
-
Inside your controller/service inject the
IDistributedLeaseManager
and call theTryAcquireLease
method. Verify if the result was successful - if it was then you can proceed with the operation; otherwise, someone else has acquired the lease:await using var leaseResult = await leaseManager.TryAcquireLease(resourceId, TimeSpan.FromSeconds(5)); if (!leaseResult.IsSuccessful) { // Someone else has required the lease for the resource. // You may want to either retry the acqusition or abort the operation. } else { // You are the lease owner now and can safely process the resource. // The lease will be released either when the leaseResult gets disposed // or when the lease expires (in the example above, in 5 seconds) }
If you'd like to use a lease storage different from the ones provided by the author, add the DistributedLeaseManager.Core
library to your project and implement the corresponding interface (see any of the existing implementations as an example).
Feel free to open a PR with your changes to include them in the package!