В моем проекте c# я использую свои методы API и хотел бы реализовать планировщик, который будет запускаться каждые 60 минут. После этого мое приложение будет докеризовано и будет запущено на сервере Ubuntu. Я использовал это решение .
Мой сервис планировщика выглядит следующим образом:
public class SchedulerService
{
private static SchedulerService _instance;
private List<Timer> timers = new List<Timer>();
private SchedulerService() { }
public static SchedulerService Instance => _instance ??= new SchedulerService();
public void ScheduleTask(int hour, int min, double intervalInHour, Action task)
{
DateTime now = DateTime.Now;
DateTime firstRun = new DateTime(now.Year, now.Month, now.Day, hour, min, 0, 0);
if (now > firstRun)
{
firstRun = firstRun.AddDays(1);
}
TimeSpan timeToGo = firstRun - now;
if (timeToGo <= TimeSpan.Zero)
{
timeToGo = TimeSpan.Zero;
}
var timer = new Timer(x =>
{
task.Invoke();
}, null, timeToGo, TimeSpan.FromHours(intervalInHour));
timers.Add(timer);
}
}
Класс MyScheduler, который использует сервис:
public static class MyScheduler
{
public static void IntervalInSeconds(int hour, int sec, double interval, Action
task)
{
interval = interval/3600;
SchedulerService.Instance.ScheduleTask(hour, sec, interval, task);
}
public static void IntervalInMinutes(int hour, int min, double interval, Action
task)
{
interval = interval/60;
SchedulerService.Instance.ScheduleTask(hour, min, interval, task);
}
public static void IntervalInHours(int hour, int min, double interval, Action task)
{
SchedulerService.Instance.ScheduleTask(hour, min, interval, task);
}
public static void IntervalInDays(int hour, int min, double interval, Action task)
{
interval = interval * 24;
SchedulerService.Instance.ScheduleTask(hour, min, interval, task);
}
}
Для тестирование, которое я тестировал, запускается каждые 10 секунд, но планировщик не работает вообще. Я уверен в своих методах, которые я тестировал без планировщика, и они работают.
Мой метод Main выглядит следующим образом:
static void Main(string[] args)
{
if (Environment.GetEnvironmentVariable("TAIKUN_USER") == null ||
Environment.GetEnvironmentVariable("TAIKUN_PASSWORD") == null ||
Environment.GetEnvironmentVariable("TAIKUN_URL") == null)
{
Console.WriteLine("Please specify all credentials");
Environment.Exit(0);
}
MyScheduler.IntervalInSeconds(DateTime.Now.Hour, DateTime.Now.Second, 10, async ()
=>
{
await PollerRequests.CreateBillingInfo(60);
await PollerRequests.CreateBillingInfo(59);
await PollerRequests.CreateBillingSummary(60);
await PollerRequests.CreateBillingSummary(59);
});
}