Add a thread safe lock to the settings

This commit is contained in:
Roger Far 2021-06-05 11:25:47 -06:00
parent 1f50cda389
commit 9a7aefaa71
2 changed files with 40 additions and 18 deletions

View file

@ -1,6 +1,6 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using RdtClient.Data.Models.Data; using RdtClient.Data.Models.Data;
@ -11,11 +11,13 @@ namespace RdtClient.Data.Data
{ {
Task<IList<Setting>> GetAll(); Task<IList<Setting>> GetAll();
Task Update(IList<Setting> settings); Task Update(IList<Setting> settings);
Task<Setting> Get(String key);
} }
public class SettingData : ISettingData public class SettingData : ISettingData
{ {
private static IList<Setting> _settingCache;
private static readonly SemaphoreSlim _settingCacheLock = new SemaphoreSlim(1);
private readonly DataContext _dataContext; private readonly DataContext _dataContext;
public SettingData(DataContext dataContext) public SettingData(DataContext dataContext)
@ -25,10 +27,25 @@ namespace RdtClient.Data.Data
public async Task<IList<Setting>> GetAll() public async Task<IList<Setting>> GetAll()
{ {
return await _dataContext.Settings.AsNoTracking().ToListAsync(); await _settingCacheLock.WaitAsync();
try
{
_settingCache ??= await _dataContext.Settings.AsNoTracking().ToListAsync();
return _settingCache;
}
finally
{
_settingCacheLock.Release();
}
} }
public async Task Update(IList<Setting> settings) public async Task Update(IList<Setting> settings)
{
await _settingCacheLock.WaitAsync();
try
{ {
var dbSettings = await _dataContext.Settings.ToListAsync(); var dbSettings = await _dataContext.Settings.ToListAsync();
@ -43,11 +60,13 @@ namespace RdtClient.Data.Data
} }
await _dataContext.SaveChangesAsync(); await _dataContext.SaveChangesAsync();
}
public async Task<Setting> Get(String key) _settingCache = null;
}
finally
{ {
return await _dataContext.Settings.AsNoTracking().FirstOrDefaultAsync(m => m.SettingId == key); _settingCacheLock.Release();
}
} }
} }
} }

View file

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using RdtClient.Data.Data; using RdtClient.Data.Data;
@ -42,7 +43,8 @@ namespace RdtClient.Service.Services
public async Task<String> GetString(String key) public async Task<String> GetString(String key)
{ {
var setting = await _settingData.Get(key); var settings = await GetAll();
var setting = settings.FirstOrDefault(m => m.SettingId == key);
if (setting == null) if (setting == null)
{ {
@ -54,7 +56,8 @@ namespace RdtClient.Service.Services
public async Task<Int32> GetNumber(String key) public async Task<Int32> GetNumber(String key)
{ {
var setting = await _settingData.Get(key); var settings = await GetAll();
var setting = settings.FirstOrDefault(m => m.SettingId == key);
if (setting == null) if (setting == null)
{ {