У меня есть служба 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();
}
}
}