Add CriticalSection for file ops

This commit is contained in:
Andrew Welker
2020-12-08 12:54:35 -07:00
parent 748b1ca147
commit 169e897748

View File

@@ -15,6 +15,7 @@ namespace PepperDash.Essentials.Core.Presets
/// </summary> /// </summary>
public class DevicePresetsModel : Device public class DevicePresetsModel : Device
{ {
private CCriticalSection _fileOps = new CCriticalSection();
private readonly bool _initSuccess; private readonly bool _initSuccess;
/// <summary> /// <summary>
@@ -101,27 +102,35 @@ namespace PepperDash.Essentials.Core.Presets
public void LoadChannels() public void LoadChannels()
{ {
PresetsAreLoaded = false;
try try
{ {
var pl = JsonConvert.DeserializeObject<PresetsList>(File.ReadToEnd(_filePath, Encoding.ASCII)); _fileOps.Enter();
Name = pl.Name; PresetsAreLoaded = false;
PresetsList = pl.Channels; try
} {
catch (Exception e) var pl = JsonConvert.DeserializeObject<PresetsList>(File.ReadToEnd(_filePath, Encoding.ASCII));
{ Name = pl.Name;
Debug.Console(2, this, PresetsList = pl.Channels;
"LoadChannels: Error reading presets file. These presets will be empty:\r '{0}'\r Error:{1}", }
_filePath, e.Message); catch (Exception e)
// Just save a default empty list {
PresetsList = new List<PresetChannel>(); Debug.Console(2, this,
} "LoadChannels: Error reading presets file. These presets will be empty:\r '{0}'\r Error:{1}",
PresetsAreLoaded = true; _filePath, e.Message);
// Just save a default empty list
PresetsList = new List<PresetChannel>();
}
PresetsAreLoaded = true;
var handler = PresetsLoaded; var handler = PresetsLoaded;
if (handler != null) if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
finally
{ {
handler(this, EventArgs.Empty); _fileOps.Leave();
} }
} }
@@ -209,12 +218,21 @@ namespace PepperDash.Essentials.Core.Presets
private void SavePresets() private void SavePresets()
{ {
var json = JsonConvert.SerializeObject(PresetsList); try
using (var file = File.Open(_filePath, FileMode.Truncate))
{ {
file.Write(json, Encoding.UTF8); _fileOps.Enter();
var json = JsonConvert.SerializeObject(PresetsList);
using (var file = File.Open(_filePath, FileMode.Truncate))
{
file.Write(json, Encoding.UTF8);
}
} }
finally
{
_fileOps.Leave();
}
} }
private void Pulse(Action<bool> act) private void Pulse(Action<bool> act)