#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. Пример кода показательный, для решение Вашей проблемы Вам нужно будет написать свою логику планирования.
Комментариев нет:
Отправить комментарий