Служба Windows переходит в состояние ожидания - PullRequest
0 голосов
/ 23 мая 2018

У меня есть служба Windows, которая связывается с БД, расположенной на другом сервере. Служба установлена ​​и всегда работает. Служба будет проверять наличие новых записей в таблице БД и получать 1000 записей за один раз через сохраненные данные.proc и обрабатывают записи (обновляет / создает в системе CRM).Логика работает отлично, но проблема в том, что служба переходит в состояние ожидания (служба находится в рабочем состоянии, но не выполняет метод ProcessNewOtranRecords, который вызывает хранимую процедуру) через несколько часов.Когда служба перезапускается, она снова работает, как и ожидалось, еще несколько часов.

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

Вот код:

    using Microsoft.Win32;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.Security.Permissions; 
    using System.ServiceProcess;
    using System.Text;
    using System.Threading.Tasks;
    using CRM.Objects.BusinessLogic; 

    namespace CRM
    {
      partial class CrmProcessOtran : ServiceBase
    {
        OtranBL _otranBL = new OtranBL();
        private System.Timers.Timer mainTimer;
        int eventID = 0;

        public CrmProcessOtran()
        {
            InitializeComponent();

        }

        protected override void OnStart(string[] args)
        {
            eventLog1.WriteEntry("Service Start");

            mainTimer = new System.Timers.Timer(30000); // 30 seconds
            mainTimer.Elapsed += PerformOtranOperations;
            mainTimer.AutoReset = false;
            mainTimer.Start(); 
        }


        protected override void OnStop()
        {
            eventLog1.WriteEntry("Service Stopped");

            mainTimer.Stop();
            mainTimer.Dispose();
            mainTimer = null; 
        }

        public void PerformOtranOperations(object sender, EventArgs e)
        {
            eventID++; 
            eventLog1.WriteEntry(DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss") + " - checking for new otran records", EventLogEntryType.Information, eventID);
            // Check for new otran records 
            int otranRecords = _otranBL.GetOtranRecordCount(eventLog1);
            if (otranRecords == 0)
            {
                eventLog1.WriteEntry("0 new otran records", EventLogEntryType.Information, eventID);
                return;
            }

            eventLog1.WriteEntry(otranRecords.ToString("N0") + " new otran records found with proc_status = 0", EventLogEntryType.Information, eventID);
            // Process new records 
            eventLog1.WriteEntry(DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss") + " - Begin processing new otran records", EventLogEntryType.Information, eventID);
            int processedrecords = _otranBL.ProcessNewOtranRecords(eventLog1);
            eventLog1.WriteEntry(processedrecords.ToString() + " processed records", EventLogEntryType.Information, eventID);

            mainTimer.Start();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Компонент Timer перехватывает и подавляет все исключения, создаваемые обработчиками событий для события Elapsed;см. MSDN .

Из-за этого вы, вероятно, не увидите никаких ошибок в средстве просмотра событий Windows.

Можете ли вы переработать свой код для использования System.Threading.Вместо этого экземпляр таймера, который не глотает исключение, если что-то идет не так.

0 голосов
/ 23 мая 2018

Вы должны добавить логику Try / Catch / finally в PerformOtranOperations.Вы, вероятно, испытываете какое-то исключение после некоторых итераций, и ваш mainTimer.Start(); никогда не вызывается с этого момента.

Таким образом, служба работает, но триггер больше не активен.

...