@Nardil
Инженер-программист

Как сделать выполнение метода на контроллере 1 раз в сутки в определенное время?

Собственно, на контроллере есть метод:
public ActionResult HideAllFood()
        {
            var foods = _canteenService.GetCanteenFoods();
            foreach (var food in foods)
            {
                if (!food.Block)
                {
                    var menu = _canteenService.GetCanteenMenubyId(food.MenuID);
                    if (menu.StatusID != 2)
                    {
                        food.StatusID = 3;
                        _canteenService.UpdateCanteenFood(food);
                    }
                }
            }
            return Json(new {success = true});
        }


Как сделать, что бы он запускался раз в сутки в определенное время?

Я вроде нашел решение, но не получается похоже сделать. Пытаюсь выполнить его в Global.asax.cs , там у меня студия ругается на мой репозиторий.

public class TimerModule : IHttpModule
        {
            static System.Threading.Timer timer;
            long interval = 30000; //30 секунд
            static object synclock = new object();
            static bool sent = false;

            public void Init(HttpApplication app)
            {
                timer = new System.Threading.Timer(new TimerCallback(HideallFood), null, 0, interval);
            }

            private void HideallFood(object obj)
            {
                lock (synclock)
                {
                    DateTime dd = DateTime.Now;
                    if (dd.Hour == 14 && dd.Minute == 1 && sent == false)
                    {
                        var foods = _canteenService.GetCanteenFoods();
                        foreach (var food in foods)
                        {
                            if (!food.Block)
                            {
                                var menu = _canteenService.GetCanteenMenubyId(food.MenuID);
                                if (menu.StatusID != 2)
                                {
                                    food.StatusID = 3;
                                    _canteenService.UpdateCanteenFood(food);
                                }
                            }
                        }

                        sent = true;
                    }
                    else if (dd.Hour != 14 && dd.Minute != 1)
                    {
                        sent = false;
                    }
                }
            }
            public void Dispose()
            { }
        }
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
@Nardil Автор вопроса
Инженер-программист
В общем коллеги по работе подсказали, как лучше сделать. Расписываю, может кому пригодится.

Создал в базе табличку, на три колонки(Name, Type, Value, все значения типа nvarchar)

Потом создаем сущность :
public class SystemVariable : BaseEntity
    {
        public string Name { get; set; }
        public string Type { get; set; }
        public string Value { get; set; }
    }


Потом прописываем в Сервисе.

На контроллере это в конце выглядело вот так:
public ActionResult Menu()
        {
            var var = _systemService.GetSystemVariableByName("DateMenuUpdate");
            if (var != null)
            {
                var type = Type.GetType(var.Type);
                var menuUpdate = (DateTime)Convert.ChangeType(var.Value, type);
                var dayCount = DateTime.Now.DayOfWeek == DayOfWeek.Monday ? -3 : -1;
                if (DateTime.Now.DayOfWeek != DayOfWeek.Saturday && DateTime.Now.DayOfWeek != DayOfWeek.Sunday && 
                    (menuUpdate.Day != DateTime.Now.Day && DateTime.Now.Hour >= 14) || (menuUpdate.Day < DateTime.Now.AddDays(dayCount).Day) && DateTime.Now.Hour < 14) 
                {
                    var.Value = DateTime.Now.ToString();
                    var foods = _canteenService.GetCanteenFoods();
                    foreach (var food in foods)
                    {
                        if (!food.Block)
                        {
                            var menu = _canteenService.GetCanteenMenubyId(food.MenuID);
                            if (menu.StatusID != 2)
                            {
                                food.StatusID = 3;
                                _canteenService.UpdateCanteenFood(food);
                            }
                        }
                    }
                     _systemService.UpdateSystemVariable(var);
                }
            }
            return View();
        }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@cicatrix
было бы большой ошибкой думать
Лучше по cron пусть запускается хранимая процедура в базе.
Веб сервер запускает ваше приложение только по требованию (когда клиент к нему обращается). Периодически (по умолчанию раз в 20 минут) ваше приложение будет перезапускаться.
Где гарантия, что ваш код не будет выполнен дважды? Может и не страшно, но кто знает, что в этот код будет добавлено потом?
Любые сервисные операции необходимо выполнять вне контекста веб-приложения. Веб приложение должно обслуживать клиентские запросы, не более.
Ответ написан
Комментировать
LifeAct
@LifeAct
Создаем и раскручиваем, не ставим на конвейер
public class TimerModule : IHttpModule
    {
        static Timer timer;
        long interval = 30000; //30 сек
        static object synclock = new object();
        static bool sent = false;

        public void Init(HttpApplication app)
        {
            timer = new Timer(new TimerCallback(SendEmail), null, 0, interval);
        }

        private void SendEmail(object obj)
            {
            lock (synclock)
            {
                DateTime dd = DateTime.Now;


                
                if (dd.Hour == 12 && dd.Minute == 13 && sent == false)
                {

                   //что то делаем


                    sent = true;

                }
                
                else if (dd.Hour != 12 && dd.Minute != 13)
                {
                    sent = false;
                }
            }
        }
        public void Dispose()
        { }
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы