public Task StartAsync(CancellationToken cancellationToken) { //Если процесс для обработки бегграундных задач if ( //true IsBackgroundProcess ) { //_logger.LogInformation("Timed Background Service is starting."); int hourToStartDailyTasks = 8; //11;//debug int minuteToStartDailyTasks = 25; //27;//debug int hourToSendDaily_TER_avg_permonth = 8; //1;//debug int minuteToSendDaily_TER_avg_permonth = 0; //25;//debug TimeSpan dayPeriod = new TimeSpan(24, 0, 0); TimeSpan halfDayPeriod = new TimeSpan(12, 0, 0); TimeSpan hourPeriod = new TimeSpan(1, 0, 0); TimeSpan cacheTasksPeriod = hourPeriod; TimeSpan TER_avg_permonth = cacheTasksPeriod; //hourPeriod; TimeToCacheTasks = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hourToStartDailyTasks, minuteToStartDailyTasks, 0); //DateTime.Now.AddSeconds(10);//debug TimeToCacheTasks = StaticMethods.CorrectionStartDay(TimeToCacheTasks, cacheTasksPeriod); TimeTo_TER_avg_permonth = TimeToCacheTasks; //new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hour: 7, minute: 55, second: 0); //DateTime.Now.AddSeconds(10);//debug TimeTo_TER_avg_permonth = StaticMethods.CorrectionStartDay(TimeTo_TER_avg_permonth, TER_avg_permonth); TimeToSendDaily_Shifts = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hour: 8, minute: 30, second: 0); TimeToSendDaily_Shifts = StaticMethods.CorrectionStartDay(TimeToSendDaily_Shifts, halfDayPeriod); TimeToSendDaily_TER_avg_permonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hourToSendDaily_TER_avg_permonth, minuteToSendDaily_TER_avg_permonth, 0); TimeToSendDaily_TER_avg_permonth = StaticMethods.CorrectionStartDay(TimeToSendDaily_TER_avg_permonth, dayPeriod); using (var scope = scopeFactory.CreateScope()) { //у нас отдельно висит процесс запущенный для фоновых задач из под сервиса, //так что проверяем чтобы пользователь был из под которого запущена служба // Важный момент, под IIS процессы быстро убиваются так что там нельзя запускать в фоне ничего долго играющего var dbContext = scope.ServiceProvider.GetRequiredService <ScaffoldContext>(); //dbContext.StgBackgroundTasklogs.Add(new StgBackgroundTasklogs { LogDateTime = DateTime.Now, Message = $"{scope.ServiceProvider.GetRequiredService<WebHostBuilderContext>().Configuration.GetSection("SESSIONNAME").Value}", TimerName = "debug",TypeId=2 }); //dbContext.StgBackgroundTasklogs.Add(new StgBackgroundTasklogs { LogDateTime = DateTime.Now, Message = $"{scope.ServiceProvider.GetRequiredService<WebHostBuilderContext>().Configuration.GetSection("USERNAME").Value}", TimerName = "debug", TypeId = 2 }); //Чтобы запускалось в круглое время вычисляем ближайшее время в формате HH:00:00 DateTime roundTime = DateTime.Now.AddHours(1).AddMinutes(-DateTime.Now.Minute).AddSeconds(-DateTime.Now.Second); List_of_timers_data.Add(new Timer_data { method = new TimerCallback(Email_report_CheckPaRecordByStatus) , StartDate = roundTime , Period = TimeSpan.FromMinutes( //ищем отчет "Отчет о некорректных записях" и получаем периодичность для задания dbContext.StgEmailReportsNames.Where(r => r.ReportNameEng == "CheckPaRecordByStatus").FirstOrDefault().DelayTime) , TimerName = "email_report_CheckPaRecordByStatus" }); List_of_timers_data.Add(new Timer_data { method = new TimerCallback(Email_report_Daily_TER_avg_permonth) , StartDate = TimeToSendDaily_TER_avg_permonth //,StartDate = DateTime.Now.AddSeconds(5) , Period = TimeSpan.FromMinutes( //ищем отчет "Средневзвешенное ТЭР на тонну по циклам производства" и получаем периодичность для задания dbContext.StgEmailReportsNames.Where(r => r.ReportNameEng == "Daily_TER_avg_permonth").FirstOrDefault().DelayTime) , TimerName = "email_report_Daily_TER_avg_permonth" }); //для управления разностью времени между задачами int diff_minutes = 0; List_of_timers_data.Add(new Timer_data { method = new TimerCallback(Fill_Caches) , StartDate = TimeToCacheTasks.AddMinutes(diff_minutes) //DateTime.Now.AddSeconds(5)//debug , Period = cacheTasksPeriod , TimerName = "Fill_Caches" }); List_of_timers_data.Add(new Timer_data { method = new TimerCallback(Fill_TER_avg_permonth) , StartDate = //DateTime.Now.AddSeconds(5) TimeTo_TER_avg_permonth , Period = TER_avg_permonth , TimerName = "Fill_TER_avg_permonth" }); diff_minutes += 1; List_of_timers_data.Add(new Timer_data { method = new TimerCallback(Email_report_SkuDataByShifts_BDM) , StartDate = //DateTime.Now.AddSeconds(5) TimeToSendDaily_Shifts , Period = halfDayPeriod , TimerName = "email_report_SkuDataByShifts_BDM" }); foreach (var timer_data in List_of_timers_data) { StaticMethods.AddNewTimer(new TimerCallback(WrapTimer), timer_data, Timers, dbContext); } } } return(Task.CompletedTask); }