forked from ddrilling/AsbCloudServer
fix add SemaphoreSlim into Cache.Refresh(..) and Cache.RefreshAsync(..) method to avoid racing
This commit is contained in:
parent
0e586edcc5
commit
9d50f0d1c9
@ -13,6 +13,7 @@ namespace AsbCloudInfrastructure.Services.Cache
|
|||||||
private (DateTime refreshDate, IEnumerable<object> entities) data;
|
private (DateTime refreshDate, IEnumerable<object> entities) data;
|
||||||
private readonly List<TEntity> cached;
|
private readonly List<TEntity> cached;
|
||||||
private readonly DbSet<TEntity> dbSet;
|
private readonly DbSet<TEntity> dbSet;
|
||||||
|
private readonly SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
|
||||||
|
|
||||||
internal CacheTable(DbContext context, (DateTime refreshDate, IEnumerable<object> entities) data)
|
internal CacheTable(DbContext context, (DateTime refreshDate, IEnumerable<object> entities) data)
|
||||||
{
|
{
|
||||||
@ -27,7 +28,10 @@ namespace AsbCloudInfrastructure.Services.Cache
|
|||||||
public int Refresh()
|
public int Refresh()
|
||||||
{
|
{
|
||||||
if (cached.Any())
|
if (cached.Any())
|
||||||
|
{
|
||||||
|
semaphore.Wait();
|
||||||
cached.Clear();
|
cached.Clear();
|
||||||
|
}
|
||||||
var dbEntities = context.Set<TEntity>().AsNoTracking().ToList();
|
var dbEntities = context.Set<TEntity>().AsNoTracking().ToList();
|
||||||
cached.AddRange(dbEntities);
|
cached.AddRange(dbEntities);
|
||||||
data.refreshDate = DateTime.Now;
|
data.refreshDate = DateTime.Now;
|
||||||
@ -37,7 +41,10 @@ namespace AsbCloudInfrastructure.Services.Cache
|
|||||||
public async Task<int> RefreshAsync(CancellationToken token = default)
|
public async Task<int> RefreshAsync(CancellationToken token = default)
|
||||||
{
|
{
|
||||||
if (cached.Any())
|
if (cached.Any())
|
||||||
|
{
|
||||||
|
await semaphore.WaitAsync(token).ConfigureAwait(true);
|
||||||
cached.Clear();
|
cached.Clear();
|
||||||
|
}
|
||||||
var dbEntities = await context.Set<TEntity>().AsNoTracking().ToListAsync(token).ConfigureAwait(false);
|
var dbEntities = await context.Set<TEntity>().AsNoTracking().ToListAsync(token).ConfigureAwait(false);
|
||||||
cached.AddRange(dbEntities);
|
cached.AddRange(dbEntities);
|
||||||
data.refreshDate = DateTime.Now;
|
data.refreshDate = DateTime.Now;
|
||||||
|
Loading…
Reference in New Issue
Block a user