C # Таймеры с перерывами - PullRequest
0 голосов
/ 11 июля 2011

Кто-нибудь может предложить какие-либо причины, по которым таймер C # (созданный в классе с выделенным кодом) остановился бы без уведомления?

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

Это меня немного смущает ...

Спасибо.

    // This gets called on page_load
    private void checkTimer()
    {
        if (!parentTimer.Enabled) // If parent timer is not enabled then it is probably the start of a new day (after a night time server backup which kills timers)
        {
            parentTimer.Interval = 60000; // One minute
            parentTimer.Elapsed += new ElapsedEventHandler(parentTimer_Elapsed); // Define what happens when elapsed
            parentTimer.AutoReset = true; // Set timer to repeat
            parentTimer.Enabled = true; // Start the timer
        }
    }

    protected void btnCancel_Click(object sender, System.EventArgs e)
    {
        parentTimer.Stop();
        ...etc...
    }

Примечание: я не изменяю ParentTimer в его прошедшем методе.

В основном ParentTimer управляет списком ChildTimers. Если ParentTimer истекает, он проверяет, истек ли также один или несколько ChildTimers, если да, то есть событие, если нет, то он сбрасывает ChildTimer и продолжает.

Ответы [ 2 ]

2 голосов
/ 11 июля 2011

Мое подозрение в том, что рабочий процесс страницы останавливается в конце запроса.

Вы можете попытаться увеличить время ожидания запроса, но лучше задать вопрос: можете ли вы объяснить, почему выпытаясь это сделать?Какую проблему вы пытаетесь решить?

Помните, что независимо от всего, что ASP.Net создает вокруг вашего кода, чтобы вам было комфортно (состояние сеанса, состояние просмотра и т. Д.), Веб-запросне сохраняющие состояния и должны рассматриваться как отдельный проход логики, это не похоже на Windows-приложение, в котором фоновый поток кода в вашей пустой функции Main (...) постоянно работает.

1 голос
/ 11 июля 2011

Таймер привязан к потоку, который его создал, и в случае ASP.net поток, который обрабатывает каждый запрос страницы, выданный данным пользователем, будет часто меняться из-за использования рабочих потоков и пула потоков.

Использование таймера на уровне страницы просто не сработает; вам нужно отслеживать состояние на уровне сеанса (привязанное к конкретному пользователю) в качестве отправной точки.

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

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

Будьте осторожны с этим, однако этот поток не может предполагать, что он всегда работает только на only - из-за перезапуска IIS, когда новый запускает старый, он все еще может работать в старый AppDomain.

...