2010-02-07 4 views
4

Нам нужно отправить рассылку/сообщения нашим пользователям в определенное время. Это делается в Интернете; однако мы хотим, чтобы это было сделано автоматически в течение определенного времени. Хотя эта проблема подходит для модели типа Window Service, но мы размещаем ее в общественном достоянии; поэтому мы не можем использовать эту опцию.Автоматически вызывать операции/действия

Есть ли способ, которым это конкретное действие может быть вызвано автоматически в определенную точку (время), указанную в конфигурации в web.config.

В настоящее время это делается путем ручного вызова операции через панель администратора.

Платформа - ASP.NET 3.5
Язык - C#

+1

Duplicate - http://stackoverflow.com/questions/1395358/is-there-a-way-to-run-a-process-every-day-in-a-net-web-application-without-writi , –

ответ

2

Там простое решение, чтобы делать такие вещи "каждый раз, когда X единиц". Хотя это не точно, что вы ищете, это удивительно просто реализовать, так что это может быть подходящим обходным решением. (Вы можете запустить задачу каждые Х минут, что делает некоторую работу, если текущее время находится в пределах некоторого заданного временного окна.)

http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

Основная идея заключается в следующем (цитата из этой ссылке):

  1. При запуске добавьте элемент в HttpRuntime.Cache с фиксированным истечением срока действия.
  2. Когда истекает срок действия элемента кэша, выполните свою работу, например WebRequest или что у вас есть.
  3. Повторно добавьте элемент в кэш с фиксированным сроком действия.

Кстати, этот метод   является   был используется для назначения значка здесь на Stackoverflow. :-)

+0

выглядит очень нахально и заражает, это может показаться решением моей проблемы. позвольте мне проверить. – Gripsoft

+0

Это объясняет, почему присвоение значка настолько заслонено. : p – Aaronaught

+0

Назначение значков больше не использует эту технику (хотя это правда, что когда-то это было - см. комментарий Джеффа Этвуда 12 февраля, комментарий к этой теме блога). –

0

Вот пример использования таймера в приложении ASP.NET. Вы можете проверить после срабатывания таймера (или срок действия кеша истекает, если вы перейдете с этой опцией), и посмотрите, прошло ли вы прошлое время в web.config для вызова вашего события.

http://www.eggheadcafe.com/tutorials/aspnet/223319d8-6366-492a-8eae-e3c7a26c88a4/refreshing-aspnet--cache.aspx

Global.asax код (необходима регистрация System.Threading.Timer):

public class Global : HttpApplication 
{ 
    private static Timer timer; 
    private int interval = 60000*5; // five minutes 


    protected void Application_Start(object sender, EventArgs e) 
    { 
     if (timer == null) 
     { 
      timer = new Timer(new TimerCallback(ScheduledWorkCallback), HttpContext.Current, interval, interval); 
      ScheduledWorkCallback(HttpContext.Current); 
     } 
    } 


    public static void ScheduledWorkCallback(object sender) 
    { 
     //do your work here 
    } 
} 
+0

Почему голос? –

+0

+1, чтобы компенсировать необъяснимое понижение. – Heinzi

1

Это можно сделать с помощью System.Threading.Timer, но вы должны быть очень осторожны, как вы это делаете. Вы можете столкнуться со всеми проблемами, если вы просто бросаете таймер так же, как в службе Windows. Служба Windows работает до тех пор, пока она запущена, и является однопоточной, если только вы не делаете ее многопоточной; ASP.NET AppDomain не является ни тем, ни другим.

This article содержит некоторую полезную информацию о том, как правильно защитить таймер.Основные моменты:

  • Вам нужно сериализовать вызовы таймера - не допускать повторного entrancy в функции обратного вызова, если один обратный вызов уже запущен, пропустите следующий;

  • Вы должны утилизировать таймер должным образом, если AppDomain выгружен, что может произойти по разным причинам.

Так идти вперед и использовать System.Threading.Timer в методе Application_Start, но помнить об этих проблемах и писать соответствующие средства защиты в код.

Смежные вопросы