Как лучше всего начать процесс обслуживания в ASP.NET?

StackOverflow https://stackoverflow.com/questions/45841

  •  09-06-2019
  •  | 
  •  

Вопрос

Учитывая приложение ASP.NET, мне необходимо регулярно запускать процесс обслуживания (ежедневно, ежечасно и т. д.).

Каков наилучший способ сделать это, не полагаясь на внешний процесс, такой как запланированное задание на сервере (предположим, у меня нет доступа к серверу - среде общего хостинга).

Это было полезно?

Решение

Вот как это делает StackOverflow:

private static CacheItemRemovedCallback OnCacheRemove = null;

protected void Application_Start(object sender, EventArgs e)
{
    AddTask("DoStuff", 60);
}

private void AddTask(string name, int seconds)
{
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
    HttpRuntime.Cache.Insert(name, seconds, null,
        DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration,
        CacheItemPriority.NotRemovable, OnCacheRemove);
}

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
    // do stuff here if it matches our taskname, like WebRequest
    // re-add our task so it recurs
    AddTask(k, Convert.ToInt32(v));
}

Подробности: http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

Другие советы

Один из способов сделать это, если вам не нужно делать это в запланированное время, а просто нужно очищать «время от времени», — создать функцию в вашем Global.asax Session_OnEnd(), которая будет создавать случайный число от 1 до 100, а если число, скажем, 50, вы выполняете задачу обслуживания.

Конечно, вы можете уменьшить значение «100», чтобы задача выполнялась чаще.

Также есть статья под названием «Моделирование службы Windows с использованием ASP.NET для запуска запланированных заданий». http://www.codeproject.com/aspnet/ASPNETService.asp который использует истекающий кеш для имитации таймера.Он утверждает, что его можно запустить на любом размещенном сайте.

Если вы используете последний, пожалуйста, прочитайте этот комментарий к посту об этой технике:

Вам нужно действительно быть осторожным в длине выполнения задачи.Каждая новая задача - это новая рабочая тема, и есть ограниченное количество из них - поскольку она «заимствует» ветку из управляемого пула потоков.

Начиная с v3.5 структуры, максимальное количество потоков было увеличено в 10 раз с 25 до 250.Но теперь у них есть логарифмический стартап, так что, поскольку он выдает больше потоков, он становится более скупым с ними.Если у вас не хватает доступных потоков в бассейне управляемых потоков - ваше время отклика пройдет через крышу.

То, что вы на самом деле пишете здесь, это система обмена сообщениями/очередью.

Если вы делаете что -то вроде обновления кэша, то во что бы то ни стало - запустите новую задачу.Если вы делаете что -то вроде загрузки вторичного HTTP -ресурса или какой -то интенсивной работы базы данных - напишите службу Windows и используйте очередь, которая позволяет вам больше контролировать, сколько вы «укусают» каждый раз.

Хотя решение Cache работает в простых случаях, если ваше расписание когда-либо изменится, вам не повезет.Вместо этого вы можете использовать Кварц.НЕТ, порт популярного Java-фреймворка Кварц, что очень гибко.

Хотя способ, которым StackOverflow это делает, определенно уникален, вы можете захотеть следить за этим. вопрос также, поскольку это касается.

это внешний процесс, и я не знаю, насколько он надежен, но вы можете настроить что-то подобное на машине, которая, как вы знаете, всегда включена. www.webcron.org.

По сути, он попадает на страницу, на которую вы его запрашиваете, по запрошенному вами расписанию.

По сути, вы можете регулярно попадать на страницу с чем угодно, что запускает вашу задачу по обслуживанию.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top