Я создал службу 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();
}
}
}