using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.DetectOperations; using AsbCloudInfrastructure.Services; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System; using System.Threading.Tasks; using System.Threading; using AsbCloudInfrastructure.Background; using AsbCloudApp.Data.SAUB; using AsbCloudInfrastructure.Services.SAUB; using AsbCloudInfrastructure.Services.Subsystems; using System.Linq; using DocumentFormat.OpenXml.InkML; using AsbCloudDb; using AsbCloudApp.Repositories; namespace AsbCloudInfrastructure { public class Startup { public static void BeforeRunHandler(IHost host) { using var scope = host.Services.CreateScope(); var provider = scope.ServiceProvider; var context = provider.GetRequiredService(); context.Database.EnshureCreatedAndMigrated(); // TODO: Сделать инициализацию кеша телеметрии более явной. _ = provider.GetRequiredService>(); _ = provider.GetRequiredService>(); var backgroundWorker = provider.GetRequiredService(); backgroundWorker.WorkStore.AddPeriodic(TimeSpan.FromMinutes(30)); backgroundWorker.WorkStore.AddPeriodic(TimeSpan.FromMinutes(15)); backgroundWorker.WorkStore.AddPeriodic(TimeSpan.FromMinutes(30)); backgroundWorker.WorkStore.AddPeriodic(TimeSpan.FromMinutes(30)); backgroundWorker.WorkStore.AddPeriodic(MakeMemoryMonitoringWork(), TimeSpan.FromMinutes(1)); var notificationBackgroundWorker = provider.GetRequiredService(); Task.Delay(1_000) .ContinueWith(async (_) => { await backgroundWorker.StartAsync(CancellationToken.None); await notificationBackgroundWorker.StartAsync(CancellationToken.None); }); } static Work MakeMemoryMonitoringWork() { var workAction = (string _, IServiceProvider _, Action _, CancellationToken _) => { var bytes = GC.GetTotalMemory(false); var bytesString = FromatBytes(bytes); System.Diagnostics.Trace.TraceInformation($"Total memory allocated is {bytesString} bytes. DbContext count is:{AsbCloudDbContext.ReferenceCount}"); return Task.CompletedTask; }; var work = Work.CreateByDelegate("Memory monitoring", workAction); return work; } static string FromatBytes(long bytes) { const double gigaByte = 1024 * 1024 * 1024; const double megaByte = 1024 * 1024; const double kiloByte = 1024; if (bytes > 10 * gigaByte) return (bytes / gigaByte).ToString("### ### ###.## Gb"); if (bytes > 10 * megaByte) return (bytes / megaByte).ToString("### ### ###.## Mb"); if (bytes > 10 * kiloByte) return (bytes / megaByte).ToString("### ### ###.## Kb"); return bytes.ToString("### ### ###"); } } }