Topshelf Windows Сервис останавливается на ночь - PullRequest
1 голос
/ 05 мая 2020

Я создал службу Windows с помощью Topshelf, которая предназначена для работы по фиксированному расписанию и продолжает работать каждый день. Я могу установить службу, и когда я ее запустил, в течение дня она будет работать правильно.

Проблема, с которой я сталкиваюсь, заключается в том, что в конце каждого дня служба прекращает опрос. Он больше не записывает в журнал, чтобы указать, что служба запущена или что таймер отслеживает. Windows по-прежнему указывает эту службу как работающую с возможностью остановки или перезапуска. Я могу вручную перезапустить службу, что позволит ей работать до конца дня. Однако, когда день заканчивается и начинается новый, кажется, что служба перестает работать.

Я безуспешно пытался изменить настройки этой службы. Есть ли значение конфигурации, которое необходимо установить, чтобы служба продолжала работать без ежедневного ручного перезапуска?

Это соответствующий код для program.cs:

namespace MyService
{
    class Program
    {
        static void Main(string[] args)
        {
            {
                HostFactory.Run(x =>
                {
                    x.Service<ServiceManager>(s =>
                    {
                        s.ConstructUsing(FileProcess => new ServiceManager());
                        s.WhenStarted(FileProcess => FileProcess.Start());
                        s.WhenStopped(FileProcess => FileProcess.Stop());
                    });

                    x.StartAutomatically();

                    x.RunAsLocalSystem();

                    x.EnableServiceRecovery(recoverOption =>
                        {
                            recoverOption.RestartService(1);
                            recoverOption.RestartService(5);
                            recoverOption.TakeNoAction();
                        });

                        x.SetServiceName("MyService");
                        x.SetDisplayName("MyService v1.0");
                        x.SetDescription("This is the description for MyService.");
                });
            }
        }
    }
}

И соответствующий код для ServiceManager.cs:

namespace MyService
{
    public class ServiceManager
    {
        private readonly Timer _timer;
        private static Logger logger = LogManager.GetCurrentClassLogger();

        public ServiceManager()
        {    

            logger.Info("Service manager start");

            ConfigurationManager.RefreshSection("appSettings");
            ConfigurationManager.RefreshSection("connectionStrings");

            //Converts TimerInterval from app.config into minutes. Timer elapses every (TimerInterval) minutes.
            Double timerInterval = (Convert.ToDouble(ConfigurationManager.AppSettings["TimerInterval"]) * 1000 * 60);

            _timer = new Timer(timerInterval) { AutoReset = true };
            _timer.Elapsed += TimerElapsed;

            logger.Info("Service manager end");
        }

        private void TimerElapsed(object sender, ElapsedEventArgs e)
        {                
                TaskManager tm = new TaskManager();
                tm.Run();                
        }

        public void Start()
        {
            logger.Debug("Start service");
            _timer.Start();
        }

        public void Stop()
        {
            logger.Debug("Stop service");
            _timer.Stop();
        }
    }
}
...