diff --git a/src/CacheTower/CacheStack.cs b/src/CacheTower/CacheStack.cs index 59a2bc65..86a03e1e 100644 --- a/src/CacheTower/CacheStack.cs +++ b/src/CacheTower/CacheStack.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Runtime.CompilerServices; using System.Threading.Tasks; using CacheTower.Extensions; @@ -15,7 +14,7 @@ public class CacheStack : ICacheStack, IFlushableCacheStack, IAsyncDisposable { private bool Disposed; - private Dictionary>> WaitingKeyRefresh { get; } + private Dictionary> WaitingKeyRefresh { get; } private ICacheLayer[] CacheLayers { get; } @@ -38,7 +37,7 @@ public CacheStack(ICacheLayer[] cacheLayers, ICacheExtension[] extensions) Extensions = new ExtensionContainer(extensions); Extensions.Register(this); - WaitingKeyRefresh = new Dictionary>>(StringComparer.Ordinal); + WaitingKeyRefresh = new Dictionary>(StringComparer.Ordinal); } /// @@ -229,10 +228,10 @@ private async ValueTask BackPopulateCacheAsync(int fromIndexExclusive, string hasLock = !WaitingKeyRefresh.ContainsKey(cacheKey); if (hasLock) { - WaitingKeyRefresh[cacheKey] = Array.Empty>(); + WaitingKeyRefresh[cacheKey] = null; } #elif NETSTANDARD2_1 - hasLock = WaitingKeyRefresh.TryAdd(cacheKey, Array.Empty>()); + hasLock = WaitingKeyRefresh.TryAdd(cacheKey, null); #endif } @@ -267,10 +266,10 @@ private async ValueTask> RefreshValueAsync(string cacheKey, Fun hasLock = !WaitingKeyRefresh.ContainsKey(cacheKey); if (hasLock) { - WaitingKeyRefresh[cacheKey] = Array.Empty>(); + WaitingKeyRefresh[cacheKey] = null; } #elif NETSTANDARD2_1 - hasLock = WaitingKeyRefresh.TryAdd(cacheKey, Array.Empty>()); + hasLock = WaitingKeyRefresh.TryAdd(cacheKey, null); #endif } @@ -313,18 +312,18 @@ private async ValueTask> RefreshValueAsync(string cacheKey, Fun } else if (noExistingValueAvailable) { - var delayedResultSource = new TaskCompletionSource(); + TaskCompletionSource completionSource; lock (WaitingKeyRefresh) { - var waitList = new[] { delayedResultSource }; - if (WaitingKeyRefresh.TryGetValue(cacheKey, out var oldList)) + if (!WaitingKeyRefresh.TryGetValue(cacheKey, out completionSource)) { - WaitingKeyRefresh[cacheKey] = oldList.Concat(waitList); + WaitingKeyRefresh[cacheKey] = new TaskCompletionSource(); } - else + else if (completionSource == null) { - WaitingKeyRefresh[cacheKey] = waitList; + completionSource = new TaskCompletionSource(); + WaitingKeyRefresh[cacheKey] = completionSource; } } @@ -337,7 +336,7 @@ private async ValueTask> RefreshValueAsync(string cacheKey, Fun } //Lock until we are notified to be unlocked - var result = await delayedResultSource.Task; + var result = await completionSource.Task; return result as CacheEntry; } @@ -348,15 +347,10 @@ private void UnlockWaitingTasks(string cacheKey, CacheEntry cacheEntry) { lock (WaitingKeyRefresh) { - if (WaitingKeyRefresh.TryGetValue(cacheKey, out var waitingTasks)) + if (WaitingKeyRefresh.TryGetValue(cacheKey, out var completionSource)) { WaitingKeyRefresh.Remove(cacheKey); - - var tasks = waitingTasks.ToArray(); - for (int i = 0, l = tasks.Length; i < l; i++) - { - tasks[i].TrySetResult(cacheEntry); - } + completionSource?.TrySetResult(cacheEntry); } } }