Как запустить планировщик асинхронно в C#? - PullRequest
0 голосов
/ 02 апреля 2020

В моем проекте 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);
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...