TimerCallback в MVC3 - PullRequest
       5

TimerCallback в MVC3

0 голосов
/ 29 марта 2012

Я использовал этот простой код для выполнения метода каждую полночь, у меня есть общий хост (невозможно создать расписание для Windows), но это не работает.Есть идеи?

 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        ControllerBuilder.Current.DefaultNamespaces.Add("PhotoPremier.Controllers");

        var dt = NextAt(new TimeSpan(0, 0, 0)); //
        var timer = new Timer(new TimerCallback(callback), HttpContext.Current, dt - DateTime.Now, TimeSpan.FromHours(24));

    }

    static void callback(Object stateObject) 
    {
        DbLayer.ContestManager cm = new DbLayer.ContestManager();
        cm.UpdateAllPhotosInContest();
    } 

    DateTime NextAt(TimeSpan time)
    {
        DateTime now = DateTime.Now;
        DateTime result = now.Date + time;

        return (now <= result) ? result : result.AddDays(1);
    }

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Это может быть связано с настройками IIS на общем хостинге.

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

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

Чтобы прояснить эту ситуацию, а также предложить другие альтернативы, я даю вам следующую ссылку:

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

0 голосов
/ 20 мая 2014

Когда я недавно пытался сделать то же самое, я обнаружил, что моей проблемой было объявление моего объекта Timer где-то, что он получает мусор.Если вы сделаете таймер членом вашего класса вместо того, чтобы объявить его локально в Application_Start, я думаю, что код оригинального плаката будет работать.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 30 марта 2012

Я думаю, что уникальным решением является использование Quarts.Net Framework.

Это очень просто, и здесь это с простым кодом.

public class DailyJob : IJob
{
    public DailyJob() { }

    public void Execute( JobExecutionContext context )
    {
        try {
            DbLayer.ContestManager cm = new DbLayer.ContestManager();
            cm.UpdateAllPhotosInContest();
        } catch( Exception e ) {
            //Handle this please
        }
    }

    public static void ScheduleJob( IScheduler sc )
    {
        JobDetail job = new JobDetail("FinishContest", "Daily", typeof(DailyJob));
        sc.ScheduleJob(job, TriggerUtils.MakeDailyTrigger("trigger1", 0, 0));
        sc.Start();
    }
}

//Global.asax
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            /* HERE */ DailyJob.ScheduleJob(new StdSchedulerFactory().GetScheduler());
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...