По моему опыту, вы можете заставить это работать "достаточно хорошо", но не идеально. Я бы порекомендовал реализовать ваши повторяющиеся задачи в службе Windows. В зависимости от того, что выполняют задачи, службе Windows, возможно, даже не придется общаться с веб-приложением или наоборот, e. г. если оба работают с одной и той же базой данных. В противном случае вы все еще можете использовать e. г. WCF для общения.
Большим преимуществом является то, что служба Windows запускается с ОС, вы можете легко настроить, запустить и остановить ее с помощью панели управления, у вас есть встроенный мониторинг через журнал событий Windows, вы можете обновить фоновую службу и веб-приложение самостоятельно и т. д.
Если это не вариант, e. г. поскольку вы находитесь в среде общего хостинга, я бы порекомендовал следующее:
- Запустите фоновый поток в Application_start (Global.asax) и сохраните ссылку на поток в статической переменной.
- Оберните каждый метод, вызываемый в фоновом потоке, с помощью try / catch, поскольку начиная с .NET 2.0 каждое необработанное исключение в фоновом потоке будет закрывать приложение. (Он будет перезапущен при следующем запросе, но он замедляет следующий запрос, убивает все текущие сеансы и кэши и, конечно, таймер не будет активен до следующего запроса.)
- При каждом запросе (реализованный имеет HttpModule или снова в Global.asax), проверьте экземпляр Thread в глобальной переменной (это все еще! = Null, поток активен и работает и т. Д.). Если нет, вызовите код перезагрузки. Используйте блокировку в части перезапуска, чтобы убедиться, что поток не будет создан дважды одновременно.
Даже тогда вы не можете быть уверены, что ваш фоновый поток всегда работает, если у вас нет регулярного трафика круглосуточно. Также имейте в виду, что в среде общего хостинга очень часто закрываются пулы приложений, если в течение нескольких часов не выполняется никаких действий. Вы можете попытаться улучшить это, настроив запланированное задание на клиентском компьютере в собственной сети, выполняя легкий запрос HTTP для вашего приложения каждые несколько минут, просто чтобы убедиться, что ваше приложение всегда работает.