From 9d50f0d1c9f2d4e81791efbe7d03f0377feef7d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Fri, 20 Aug 2021 12:45:26 +0500 Subject: [PATCH] fix add SemaphoreSlim into Cache.Refresh(..) and Cache.RefreshAsync(..) method to avoid racing --- AsbCloudInfrastructure/Services/Cache/CacheTable.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs index db0aee2e..445fb8cc 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs @@ -13,6 +13,7 @@ namespace AsbCloudInfrastructure.Services.Cache private (DateTime refreshDate, IEnumerable entities) data; private readonly List cached; private readonly DbSet dbSet; + private readonly SemaphoreSlim semaphore = new SemaphoreSlim(1, 1); internal CacheTable(DbContext context, (DateTime refreshDate, IEnumerable entities) data) { @@ -27,7 +28,10 @@ namespace AsbCloudInfrastructure.Services.Cache public int Refresh() { if (cached.Any()) + { + semaphore.Wait(); cached.Clear(); + } var dbEntities = context.Set().AsNoTracking().ToList(); cached.AddRange(dbEntities); data.refreshDate = DateTime.Now; @@ -37,7 +41,10 @@ namespace AsbCloudInfrastructure.Services.Cache public async Task RefreshAsync(CancellationToken token = default) { if (cached.Any()) - cached.Clear(); + { + await semaphore.WaitAsync(token).ConfigureAwait(true); + cached.Clear(); + } var dbEntities = await context.Set().AsNoTracking().ToListAsync(token).ConfigureAwait(false); cached.AddRange(dbEntities); data.refreshDate = DateTime.Now;