Лучшая реализация фоновой службы 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 (находится в Jeff Atwood сообщение здесь)

Мне нужно запустить несколько фоновых "сервисов" в данный момент времени. Одна услуга может выполняться каждые 5 минут, когда другая может быть раз в день. За один раз это будет не более 10 сервисов.

Ответ 1

Ну, вместо "Простой поток" вы бы пошли на ThreadPool.

И если бы это был я, я бы запустил его в службе Windows и общался с ним через MSMQ.

Ответ 2

Вы должны реализовать некоторые состояния задач. После повторного использования приложения фоновая служба должна устранить неисправные задачи. Если задачи находятся под транзакциями, тогда никаких проблем с этим поведением не будет.

Ответ 3

Ни одно из предложений исходного плаката не масштабируется для нескольких серверов.

Я хочу то же самое: Простой и простой в использовании способ планирования регулярных фоновых задач и выполнения тяжелой обработки ad-hoc (перестроить кеши и т.д.), Не влияя на текущий запрос пользователей.

Я хочу, чтобы задачи выполнялись в контексте веб-приложений: a) получить конфигурацию из web.config(избегать дублирования конфигурации) и b) развертываться с помощью веб-приложения (простота развертывания). И мне нужно, чтобы он работал на сайтах, распространяемых на несколько серверов.

Я нашел только один подход, который дает несколько то, что я хочу:

(1) Создайте страницу .aspx для каждой задачи и настройте запланированную задачу wget на одном отдельном сервере, который вызывает этот .aspx на веб-сайте. Я реализовал этот подход, и он работает, но мне он не нравится на 100% из-за запланированной зависимости от задачи и не дает мне возможности выполнять тяжелые задачи ad hoc в фоновом режиме.