Windows服务进入空闲状态

时间:2018-05-23 13:46:46

标签: c# asp.net .net service windows-services

我有一个与驻留在不同服务器上的数据库通信的Windows服务。服务已安装并且始终在运行。服务将查看数据库表中是否有任何新记录,并通过存储一次获取1000条记录处理和处理记录(在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 :(得分:0)

您应该在PerformOtranOperations中添加一些Try / Catch / Finally逻辑。经过一些迭代后,您可能会遇到一些异常,从那时起就不会调用mainTimer.Start();

所以服务正在运行,但触发器不再处于活动状态。

答案 1 :(得分:0)

Timer组件捕获并抑制事件处理程序抛出的所有异常 为Elapsed事件;见MSDN

因此,您可能在Windows事件查看器中看不到任何错误。

您是否可以重新编写代码以使用System.Threading.Timer实例,如果出现问题则不会吞下异常。

正如Pavlinll建议的那样,您应该实施一些错误处理以保持服务正常运行。