У меня есть консольное приложение, которое всегда работает как служба windows (Topshelf), и приложение должно всегда подключаться к SQL серверу, и на основании некоторых условий следует проверять некоторые данные в базе данных и отправлять напоминание, но когда что-то происходит например, на sql сервере не удалось установить sh соединение с SQL сервером. Служба застряла в состоянии «Останов» и не может запуститься снова.
Есть ли способ перезапустить службу или сделать задержку до SQL сервер снова запущен и работает.
Это мой код:
ConfigureService:
HostFactory.Run(configure =>
{
configure.Service<MyService>(service =>
{
service.ConstructUsing(s => new MyService());
service.WhenStarted(s => s.Start());
service.WhenStopped(s => s.Stop());
});
configure.RunAsLocalSystem();
configure.SetServiceName("ServiceName");
configure.SetDisplayName("ServiceName");
configure.SetDescription("ServiceName");
configure.EnableServiceRecovery(r =>
{
r.RestartService(0);
r.RestartService(1);
r.RestartService(2);
r.SetResetPeriod(1);
});
configure.StartAutomaticallyDelayed();
configure.OnException((ex) =>
{
new MailHandler().Send("","",""); //send mail
});
});
MyService:
private SemaphoreSlim _semaphoreToRequestStop;
private Thread _thread;
public void Start()
{
_semaphoreToRequestStop = new SemaphoreSlim(0);
_thread = new Thread(DoWork);
_thread.Start();
}
public void Stop()
{
_semaphoreToRequestStop.Release();
_thread.Join();
}
private void DoWork()
{
var sleeptimer = 0; // 0 sec;
Console.WriteLine("Starting..");
while (true)
{
if (_semaphoreToRequestStop.Wait(500))
{
Console.WriteLine("Stopped");
break;
}
if (sleeptimer > 300000)
{
sleeptimer = 300000;
Console.WriteLine("sleeping: " + (sleeptimer / 1000) + " secs");
Thread.Sleep(sleeptimer);
}
else
{
Console.WriteLine("sleeping: " + (sleeptimer / 1000) + " secs");
Thread.Sleep(sleeptimer);
sleeptimer = sleeptimer + 1000;
}
var d2 = DateTime.Today.AddDays(-14);
var rmaHistories = db.namespace.Where(t => (t.LastNotifiedDate == null) && t.SagesType == "ÅBNE" && t.RMASendDato <= d2).ToList();
if (rmaHistories.Any())
{
foreach (var item in rmaHistories)
{
item.LastNotifiedDate = DateTime.Now;
}
db.SaveChanges();
new MailHandler().Send("Send Reminder","","");
}
}
}