Add a thread safe lock to the settings
This commit is contained in:
parent
1f50cda389
commit
9a7aefaa71
2 changed files with 40 additions and 18 deletions
|
|
@ -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<IList<Setting>> GetAll();
|
||||
Task Update(IList<Setting> settings);
|
||||
Task<Setting> Get(String key);
|
||||
}
|
||||
|
||||
public class SettingData : ISettingData
|
||||
{
|
||||
private static IList<Setting> _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<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)
|
||||
{
|
||||
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<Setting> Get(String key)
|
||||
{
|
||||
return await _dataContext.Settings.AsNoTracking().FirstOrDefaultAsync(m => m.SettingId == key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<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)
|
||||
{
|
||||
|
|
@ -54,7 +56,8 @@ namespace RdtClient.Service.Services
|
|||
|
||||
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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue