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.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,29 +27,46 @@ 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)
|
||||||
{
|
{
|
||||||
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.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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue