Topshelf - Windows сервис застрял в состоянии остановки - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть консольное приложение, которое всегда работает как служба windows (Topshelf), и приложение должно всегда подключаться к SQL серверу, и на основании некоторых условий следует проверять некоторые данные в базе данных и отправлять напоминание, но когда что-то происходит например, на sql сервере не удалось установить sh соединение с SQL сервером. Служба застряла в состоянии «Останов» и не может запуститься снова.

scr

Есть ли способ перезапустить службу или сделать задержку до 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","",""); 

            }
        }
    }
...