我有一个与驻留在不同服务器上的数据库通信的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();
}
}
}
答案 0 :(得分:0)
您应该在PerformOtranOperations中添加一些Try / Catch / Finally逻辑。经过一些迭代后,您可能会遇到一些异常,从那时起就不会调用mainTimer.Start();
。
所以服务正在运行,但触发器不再处于活动状态。
答案 1 :(得分:0)
Timer组件捕获并抑制事件处理程序抛出的所有异常 为Elapsed事件;见MSDN。
因此,您可能在Windows事件查看器中看不到任何错误。
您是否可以重新编写代码以使用System.Threading.Timer实例,如果出现问题则不会吞下异常。
正如Pavlinll建议的那样,您应该实施一些错误处理以保持服务正常运行。