diff --git a/server/RdtClient.Data/Data/SettingData.cs b/server/RdtClient.Data/Data/SettingData.cs index f51ba30..61612b5 100644 --- a/server/RdtClient.Data/Data/SettingData.cs +++ b/server/RdtClient.Data/Data/SettingData.cs @@ -1,6 +1,6 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using RdtClient.Data.Models.Data; @@ -11,11 +11,13 @@ namespace RdtClient.Data.Data { Task> GetAll(); Task Update(IList settings); - Task Get(String key); } public class SettingData : ISettingData { + private static IList _settingCache; + private static readonly SemaphoreSlim _settingCacheLock = new SemaphoreSlim(1); + private readonly DataContext _dataContext; public SettingData(DataContext dataContext) @@ -25,29 +27,46 @@ namespace RdtClient.Data.Data public async Task> 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 settings) { - var dbSettings = await _dataContext.Settings.ToListAsync(); + await _settingCacheLock.WaitAsync(); - foreach (var dbSetting in dbSettings) + try { - var setting = settings.FirstOrDefault(m => m.SettingId == dbSetting.SettingId); + var dbSettings = await _dataContext.Settings.ToListAsync(); - if (setting != null) + foreach (var dbSetting in dbSettings) { - dbSetting.Value = setting.Value; + var setting = settings.FirstOrDefault(m => m.SettingId == dbSetting.SettingId); + + if (setting != null) + { + dbSetting.Value = setting.Value; + } } + + await _dataContext.SaveChangesAsync(); + + _settingCache = null; + } + finally + { + _settingCacheLock.Release(); } - - await _dataContext.SaveChangesAsync(); - } - - public async Task Get(String key) - { - return await _dataContext.Settings.AsNoTracking().FirstOrDefaultAsync(m => m.SettingId == key); } } } diff --git a/server/RdtClient.Service/Services/Settings.cs b/server/RdtClient.Service/Services/Settings.cs index 347afb1..0d5e8e7 100644 --- a/server/RdtClient.Service/Services/Settings.cs +++ b/server/RdtClient.Service/Services/Settings.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; using RdtClient.Data.Data; @@ -42,7 +43,8 @@ namespace RdtClient.Service.Services public async Task GetString(String key) { - var setting = await _settingData.Get(key); + var settings = await GetAll(); + var setting = settings.FirstOrDefault(m => m.SettingId == key); if (setting == null) { @@ -54,7 +56,8 @@ namespace RdtClient.Service.Services public async Task GetNumber(String key) { - var setting = await _settingData.Get(key); + var settings = await GetAll(); + var setting = settings.FirstOrDefault(m => m.SettingId == key); if (setting == null) {