Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Выполнение операций по расписанию

#c_sharp #.net #планировщик_задач


Необходимо проводить определенные действия по расписанию, абстрактный пример:


в понедельник в 12:00 взять файлы из папки
во вторник в 13:39 создать папку с файлами
в третью пятницу в 7:03 посчитать количество файлов


Целесообразно ли будет для этого использовать timer с Interval в минуту и в его Tick
проверять время и день недели?

private void timer1_Tick(object sender, EventArgs e)
{
   var currentTime = DateTime.Now.TimeOfDay;
   var currentDow = DateTime.Now.DayOfWeek;
   var oneMinute = new TimeSpan(0, 1, 0);
   if ((currentDow  == DayOfWeek.Monday)&&(currentTime-timeMonday


Ответы

Ответ 1



Нет, этого совершенно недостаточно. Windows не дает никаких гарантий, что ваш таймер и правда будет вызываться каждую минуту. С такими сравнениями вы запросто пропустите нужное время или отработаете два раза. Более правильно будет хранить для каждой задачи следующее время запуска и запускать задачу когда текущее время больше запланированного (но не вышло за пределы некоторого разумного интервала). Про строгие сравнения времени забудьте в принципе! PS для справки - мой старый ответ на смежную тематику: https://ru.stackoverflow.com/a/593736/178779

Ответ 2



Лучше используйте библиотеку Quartz.net, она специально предназначена для таких целей и очень гибко настраивается. Также она есть в nuget: Install-Package Quartz Либо можно вообще воспользоваться средствами планировщика задач Windows.

Ответ 3



Hangfire — планировщик задач для .NET На мой взгляд это самый лучший многопоточный и масштабируемый планировщик задач. Легкая установка с помощью NuGet Install-Package Hangfire С коробки есть красивый дашборд со всей статистикой и всеми запланированными заданиями. Краткий обзор на habrahabr

Ответ 4



Я бы разделил программу на 3 модуля и использовал бы стандартный Windows Task Scheduler. Тестировать будет удобнее + всегда понятно, какой компонент работает неверно

Ответ 5



Можете посмотреть в сторону TopShelf + Quartz, очень удобно + есть всё что нужно (модули для DI, планирование как угодно). Для этого Вам нужно будет разделить работы (создать классы производные от IJob), потом описать механизм планирования например так: private static void ScheduleRepeatableJobIn**(ServiceConfigurator serviceConfigurator, int timeout) where T : IJob { serviceConfigurator.ScheduleQuartzJob(configurator => configurator.WithSimpleRepeatableSchedule(TimeSpan.From**(timeout), typeof(T).Name)); } И потом просто запустить сервис/консоль так: HostFactory.Run(x => { x.Service(s => { ScheduleRepeatableJobInMinutes(s, timeout); ScheduleRepeatableJobInMinutes(s, timeout); s.WhenStarted(tc => tc.Start()); s.WhenStopped(tc => tc.Stop()); }); }); P.S. Пример кода показательный, для решение Вашей проблемы Вам нужно будет написать свою логику планирования.

Комментариев нет:

Отправить комментарий