Таймер C # не работает правильно - PullRequest
0 голосов
/ 05 августа 2011

Я использую Asp .NET Mvc 3 для создания веб-страницы, и мне нужно что-то менять в базе данных каждые 20 минут ... Я установил Timer в моем файле Global.asax.cs.Вот код

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

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
    Unit = new UnitOfWork();
    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Interval = 1200000; //20 minutes
    timer.Elapsed += new System.Timers.ElapsedEventHandler(Elapsed);
    timer.Start();
}

void Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    Unit.Srvc.UpdateUserActivity();
}

Теперь я запускаю его сегодня, и что за жалость, он работает только один раз ... Через 20 минут он меняет базу данных, и все.

PS Да, сегодня япроверил его за 20 секунд, и он работает нормально.Но сегодня он не хочет работать правильно с интервалом в 20 минут.Спасибо за помощь.

PS2 Я использовал хранимую процедуру для обновления базы данных.

PS3 Только сейчас я обнаруживаю, что она работает случайным образом: D В 5:32 Я запускаю программу ... Она работаетв 5:52 утра, не работает в 6:12 утра и работает сейчас (сейчас 6:49 утра, я не знаю, когда это работает).

Ответы [ 4 ]

4 голосов
/ 05 августа 2011

Скорее всего, причина в том, что ваш AppDomain завершает работу из-за неактивности, что означает, что не работает все приложение. Я думаю, что время простоя составляет 20 минут бездействия.

Смотрите этот вопрос:

Как сохранить сборки ASP.NET в AppDomain живыми?

1 голос
/ 05 августа 2011

Мне кажется, что ваш таймер будет убит сборщиком мусора, так как вы не сохраняете ссылку на него после того, как он выходит из области действия из Application_Start.Попробуйте добавить:

Application["Whatever"] = timer;
0 голосов
/ 05 августа 2011

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

Чтение кода, который я предполагаю (снова), что вы отмечаете пользователя в базе данных как "неактивного"или отключен или что-то в этом роде.Если это так, не используйте таймер для этого, вместо этого установите срок действия сеанса (когда пользователь не отправлял никаких запросов в течение определенного периода) на требуемую продолжительность и поместите код, который вы хотитезапускать, когда это происходит в обработчике Session_OnEnd

0 голосов
/ 05 августа 2011

Возможно, вы обнаружили, что ваш поток (из IIS AppPool) перерабатывается или закрывается.

Веб-приложения обычно работают лучше, когда они используются для обработки запросов-ответов, а не для этого типа поведения. Непонятно, чем вы занимаетесь, но при условии, что вы используете SQL Server, возможно, вы могли бы взглянуть на задачи обслуживания или триггеры, если они связаны с денормализацией данных (то есть сворачиванием вычисленных данных). Если это связано с данными, собранными в процессе запрос-ответ, то, возможно, вы могли бы рассмотреть использование веб-кэша и некоторых операций истечения срока действия кэша для отложенного хранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...