diff --git a/Directory.Packages.props b/Directory.Packages.props
index a568b976e1..8ee0831103 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -7,7 +7,6 @@
-
diff --git a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj
index 83f8f0076b..773c954051 100644
--- a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj
+++ b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj
@@ -18,7 +18,6 @@
-
diff --git a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLock.cs b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLock.cs
index 15956b159e..d8d8eb9d09 100644
--- a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLock.cs
+++ b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLock.cs
@@ -1,19 +1,14 @@
using System;
-using System.Runtime.CompilerServices;
+using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
-using AsyncKeyedLock;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.DistributedLocking;
public class LocalAbpDistributedLock : IAbpDistributedLock, ISingletonDependency
{
- private readonly AsyncKeyedLocker _localSyncObjects = new(o =>
- {
- o.PoolSize = 20;
- o.PoolInitialFill = 1;
- });
+ private readonly ConcurrentDictionary _localSyncObjects = new();
protected IDistributedLockKeyNormalizer DistributedLockKeyNormalizer { get; }
public LocalAbpDistributedLock(IDistributedLockKeyNormalizer distributedLockKeyNormalizer)
@@ -21,7 +16,6 @@ public class LocalAbpDistributedLock : IAbpDistributedLock, ISingletonDependency
DistributedLockKeyNormalizer = distributedLockKeyNormalizer;
}
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
public async Task TryAcquireAsync(
string name,
TimeSpan timeout = default,
@@ -30,11 +24,8 @@ public class LocalAbpDistributedLock : IAbpDistributedLock, ISingletonDependency
Check.NotNullOrWhiteSpace(name, nameof(name));
var key = DistributedLockKeyNormalizer.NormalizeKey(name);
- var timeoutReleaser = await _localSyncObjects.LockOrNullAsync(key, timeout, cancellationToken);
- if (timeoutReleaser is not null)
- {
- return new LocalAbpDistributedLockHandle(timeoutReleaser);
- }
- return null;
+ var semaphore = _localSyncObjects.GetOrAdd(key, _ => new SemaphoreSlim(1, 1));
+ var acquired = await semaphore.WaitAsync(timeout, cancellationToken);
+ return acquired ? new LocalAbpDistributedLockHandle(semaphore) : null;
}
}
diff --git a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLockHandle.cs b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLockHandle.cs
index d08451657e..5ffe95af5e 100644
--- a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLockHandle.cs
+++ b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo/Abp/DistributedLocking/LocalAbpDistributedLockHandle.cs
@@ -1,20 +1,21 @@
-using System;
+using System.Threading;
using System.Threading.Tasks;
-namespace Volo.Abp.DistributedLocking;
-
-public class LocalAbpDistributedLockHandle : IAbpDistributedLockHandle
+namespace Volo.Abp.DistributedLocking
{
- private readonly IDisposable _disposable;
-
- public LocalAbpDistributedLockHandle(IDisposable disposable)
+ public class LocalAbpDistributedLockHandle : IAbpDistributedLockHandle
{
- _disposable = disposable;
- }
+ private readonly SemaphoreSlim _semaphore;
- public ValueTask DisposeAsync()
- {
- _disposable.Dispose();
- return default;
+ public LocalAbpDistributedLockHandle(SemaphoreSlim semaphore)
+ {
+ _semaphore = semaphore;
+ }
+
+ public ValueTask DisposeAsync()
+ {
+ _semaphore.Release();
+ return default;
+ }
}
}