Я хотел бы создать планировщик заданий. Таким образом, этот планировщик заданий позволяет пользователю настроить:Создайте планировщик заданий в C#
- Начало работы. (Значение даты и времени)
- Частота работы: минуты, часы, дни, месяцы, годы (любое целое число)
У меня есть 2 варианта, как строить этот планировщик:
Используйте C# Класс таймера. Но это также означает, что я должен создать новый объект Timer для каждого запланированного задания. Я планирую выставить конечную точку API для вызова пользователем и POST информацию о времени начала и частоте. Поэтому, когда вызывается конечная точка, мне нужно будет создать новый объект Timer. Будет ли это даже масштаб? Как управлять объектами Timer? Мне нужно разрешить пользователю создавать, обновлять и удалять свои задания.
Использовать Azure Scheduler. Однако у меня очень большая база данных пользователей. Я посмотрел на цены, максимальные общие задания, которые могут выполняться в одном экземпляре, составляют только 5 миллионов рабочих мест. Кроме того, мне сложно управлять работающими экземплярами, если у меня работает более одного экземпляра. Как я могу решить загрузить баланс нескольких экземпляров планировщиков?
Вы можете с некоторой математикой обрабатывать несколько запланированных заданий с помощью одного таймера ... –
Да, но это недействительно для моего случая, потому что пользователи могут вводить любое целое число для рабочей частоты. Я все равно создам разные таймеры для разных частот. У меня большая пользовательская база данных, разные пользователи захотят настроить их работу по-разному. – Nyamnyam
Если вы хотите создать его самостоятельно, просто запустите один таймер и проверьте, сколько осталось времени для следующей итерации запланированного задания и обновлять его каждый раз. Например, если вы запускаете свой таймер каждую секунду (может быть, слишком часто) и попадаете на задание, которое нужно начинать сейчас, добавьте одну минуту и сохраните его в качестве следующего времени выполнения, а при каждом тике галочка вы проверите, прошло ли это время. В противном случае для этого есть хорошие библиотеки, см. Мой ответ ниже. –