using System; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Hosting; using AsbCloudInfrastructure.Services.Cache; using AsbCloudDb.Model; namespace AsbCloudInfrastructure.Services.Analysis { public class TelemetryAnalyticsBackgroundService : BackgroundService { private readonly CacheDb cacheDb; private readonly TimeSpan period = TimeSpan.FromHours(1); public TelemetryAnalyticsBackgroundService(CacheDb cacheDb) { this.cacheDb = cacheDb; } protected override async Task ExecuteAsync(CancellationToken token = default) { var timeToStartAnalysis = DateTime.Now; var options = new DbContextOptionsBuilder() .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") .Options; while (!token.IsCancellationRequested) { if(DateTime.Now > timeToStartAnalysis) { timeToStartAnalysis = DateTime.Now + period; try { using var context = new AsbCloudDbContext(options); var telemetryService = new TelemetryService(context, cacheDb); var analyticsService = new TelemetryAnalyticsService(context, telemetryService, cacheDb); await analyticsService.AnalyzeAndSaveTelemetriesAsync(token).ConfigureAwait(false); context.ChangeTracker.Clear(); context.Dispose(); } catch (Exception ex) { Trace.TraceError(ex.Message); Console.WriteLine(ex.Message); } GC.Collect(); } var ms = (int)(timeToStartAnalysis - DateTime.Now).TotalMilliseconds; ms = ms > 100 ? ms : 100; await Task.Delay(ms, token).ConfigureAwait(false); } } public override async Task StopAsync(CancellationToken token) { await base.StopAsync(token).ConfigureAwait(false); } } }