Могу ли я сохранить System.Timers.Timer в ObjectCache для последующего доступа?
Мне нужно выполнить следующее требование для моей работы.
- Когда пользователь запускает новое приложение, запускается 5-минутный таймер.
- Если пользователь вносит какие-либо изменения в приложение до истечения 5 минут, таймер отменяется.
- Если таймер запускается до конца, нашей компании отправляется электронное письмо ("заявка была создана, но заброшена").
Веб-сервер для этого проекта - это проект.NET MVC, хотя все, кроме Home Controller, все контроллеры наследуются от System.Web.Http.ApiController, а не System.Web.Mvc.Controller. Передняя часть угловая 6.
Кажется, достаточно просто запустить 5-минутный таймер, который будет выполнять метод "отправки по электронной почте" через 5 минут. Я застрял на том, как реализовать возможность отмены таймера, если пользователь редактирует приложение до того, как таймер закончится. Команда для запуска приложения и любые последующие изменения будут поступать как отдельные запросы к API, поэтому я не поддерживаю никакого состояния от вызова к вызову.
Моя текущая идея состоит в том, чтобы создать таймер через System.Timers.Timer при запуске приложения и сохранить таймер в ObjectCache под уникальным идентификатором, представляющим это конкретное приложение. Затем, когда вызывается действие редактирования, я могу проверить кэш, чтобы увидеть, хранится ли таймер, соответствующий редактируемому приложению, и, если это так, отменить таймер. Если такой звонок не поступит в течение 5 минут, таймер сработает и электронное письмо будет отправлено.
Будет ли это работать? (Возможность доступа к таймеру, чтобы отменить его, и срабатывание таймера, как ожидалось, если не отменено?) Существует ли лучший или более подходящий для.NET способ реализации этого требования? Извиняюсь за неопределенную сферу этого вопроса; Мне не повезло с Google или поиском ТАК, хотя моё незнакомство с работой с таймерами может мешать моим поискам.
Спасибо!
1 ответ
Корень вашей проблемы - архитектурный. Возможно, вам следует больше задуматься о том, как спроектирован ваш сервер и как клиентский дизайн и серверный дизайн дополняют друг друга. Для начала постоянное состояние, возможность запуска некоторых фоновых задач и использование функциональных возможностей блокировки (таких как ключевое слово lock в C#) при доступе к этому постоянному состоянию помогут создать более расширяемый и гибкий дизайн. Как вы разрабатываете эти функции и как взаимодействует ваша клиентская сторона, зависит только от вас. Один из подходов заключается в том, чтобы контроллер API выполнял запись в постоянное состояние, используя блокировку для предотвращения одновременной записи, а затем используя фоновую задачу для отслеживания этого постоянного состояния и запуска определенных действий при необходимости. Поиграйте с дизайном и выясните, что работает для ваших нужд. Удачи в вашем приложении.