Задать вопрос
@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()
            { }
        }
  • Вопрос задан
  • 175 просмотров
Подписаться 1 Простой 7 комментариев
Решение пользователя Дмитрий К ответам на вопрос (3)
@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();
        }
Ответ написан
Комментировать