I18NCommander/I18N Commander/Processor/ExportProcessor.cs
Thorsten Sommer 52927d4715
Fixed export synchronization
- Replaced Monitor by another semaphore, because async method calls are
  not working with monitors!
2023-01-22 21:50:15 +01:00

46 lines
1.5 KiB
C#

using DataModel.Database.Common;
using Microsoft.Extensions.DependencyInjection;
using Timer = System.Timers.Timer;
namespace Processor;
public static class ExportProcessor
{
private static readonly Timer EXPORT_TIMER = new();
private static readonly SemaphoreSlim EXPORT_SEMAPHORE_BRICK_WALL = new(2);
private static readonly SemaphoreSlim EXPORT_SEMAPHORE_EXPORTING = new(1);
static ExportProcessor()
{
EXPORT_TIMER.Interval = 6_000; // 6 seconds
EXPORT_TIMER.AutoReset = false;
EXPORT_TIMER.Elapsed += async (sender, args) => await ExportToJson();
}
private static async Task ExportToJson()
{
if(!await EXPORT_SEMAPHORE_BRICK_WALL.WaitAsync(1))
return;
try
{
await EXPORT_SEMAPHORE_EXPORTING.WaitAsync();
await using var db = ProcessorMeta.ServiceProvider.GetRequiredService<DataContext>();
await db.ExportAsync(Environment.ExpandEnvironmentVariables(Path.Join(await AppSettings.GetAutoExportDestinationPath(), await AppSettings.GetAutoExportFilename())));
}
finally
{
EXPORT_SEMAPHORE_EXPORTING.Release();
EXPORT_SEMAPHORE_BRICK_WALL.Release();
}
}
public static async Task TriggerExport()
{
if (!await AppSettings.GetAutoExportEnabled())
return;
EXPORT_TIMER.Stop();
EXPORT_TIMER.Start();
}
}