using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.DetectOperations; using AsbCloudInfrastructure.Services; 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 AsbCloudDb; using AsbCloudApp.Repositories; using AsbCloudInfrastructure.Background.PeriodicWorks; 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.EnsureCreatedAndMigrated(); // TODO: Сделать инициализацию кеша телеметрии более явной. _ = provider.GetRequiredService>(); _ = provider.GetRequiredService>(); var backgroundWorker = provider.GetRequiredService(); backgroundWorker.Add(TimeSpan.FromDays(1)); backgroundWorker.Add(TimeSpan.FromMinutes(30)); backgroundWorker.Add(TimeSpan.FromMinutes(15)); backgroundWorker.Add(TimeSpan.FromMinutes(30)); backgroundWorker.Add(MakeMemoryMonitoringWork(), TimeSpan.FromMinutes(1)); var notificationBackgroundWorker = provider.GetRequiredService(); } 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("### ### ###"); } } }