Лучшая реализация фоновой службы ASP.NET
Какова лучшая реализация для нескольких фоновых служб в приложении ASP.NET?
Таймер обратного вызова
Timer timer = new Timer(new TimerCallback(MyWorkCallback), HttpContext, 5000, 5000);
Thread или ThreadPool
Thread thread = new Thread(Work); thread.IsBackground = true; thread.Start();
BackgroundWorker
BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(DoMyWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DoMyWork_Completed); worker.RunWorkerAsync();
Кэширование, например http://www.codeproject.com/KB/aspnet/ASPNETService.aspx (находится в посте Джеффа Этвуда здесь)
Мне нужно запустить несколько фоновых "служб" в определенный момент времени. Одна служба может запускаться каждые 5 минут, а другая - один раз в день. Никогда не будет более 10 сервисов, работающих одновременно.
3 ответа
Ну, вместо "Simple Thread", вы бы выбрали ThreadPool.
И если бы это был я, я бы запустил его в службе Windows и связывался с ним через MSMQ.
Вы должны реализовать некоторые состояния задач. После перезагрузки приложения фоновый сервис должен восстанавливать неработающие задачи. Если задачи находятся в транзакциях, то с таким поведением проблем не будет.
Ни одно из предложений оригинального постера не распространяется на несколько серверов.
Я хочу то же самое: надежный и простой в использовании способ планирования регулярных фоновых задач и выполнения специальной тяжелой обработки (перестройка кэшей и т. Д.), Не затрагивая текущий запрос пользователей.
Я хочу, чтобы задачи выполнялись в контексте веб-приложений, чтобы: а) получить конфигурацию из web.config (избежать дублирования конфигурации) и б) развернуть с веб-приложением (упростить развертывание).И мне это нужно, чтобы веб-сайты распространялись более чем на один сервер.
Я нашел только один подход, который обеспечивает то, что я хочу:
(1) Создайте страницу.aspx для каждой задачи и настройте запланированную задачу wget на одном отдельном сервере, который вызывает этот файл.aspx на веб-сайте. Я реализовал этот подход, и он работает, но он мне не нравится на 100% из-за зависимости от запланированных задач, и он не дает мне возможности выполнять тяжелые задачи в фоновом режиме.