Windows служба работает, ничего не делая - PullRequest
0 голосов
/ 14 января 2020

Мой сервис работает, но он не выполняет ни одной логики c Я вставлен в OnStart. Кроме того, я пытаюсь записывать сообщения в программу просмотра событий, но она даже не попадает в ту часть (которая, я полагаю, падает до начала.) Может кто-нибудь сказать мне, что я делаю не так? Спасибо,

 public partial class DSGService : ServiceBase
    {
        private static string ftpPath = ConfigurationManager.AppSettings["FtpPath"];
        private Timer _timer;
        private bool _isRunning;

        public DSGService()
        {
            InitializeComponent();
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

        }

        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            WriteToEventViewer("error!:" + e.ExceptionObject.ToString());
        }

OnStart logi c

        protected override void OnStart(string[] args)
        {
            _isRunning = false;
            _timer = new Timer
            {
                AutoReset = true,
                Interval = 5000,

            };
            _timer.Elapsed += new ElapsedEventHandler(this.TimerElapsed);
            _timer.Start();
        }

код для выполнения действий

        private void TimerElapsed(object sender, ElapsedEventArgs e)
        {
            if (_isRunning)
            {
                WriteToEventViewer("isrunning is true");
                return;
            }

            try
            {
                _isRunning = true;
                WriteToEventViewer("started");
                //do things..
                    WriteToEventViewer("generated!");
                }

            }
            finally
            {
                _isRunning = false;
                WriteToEventViewer("done");
            }
        }
        private void GenerateAndPublishData(ServerData server)
        {
            try
            {
//do things...

            }
            catch (Exception ee)
            {
                WriteToEventViewer(string.Format("error: {0}", ee);
            }
        }
        protected override void OnStop()
        {

            _timer.Stop();
            _timer.Dispose();
            _timer = null;
                    }

запись в EventViewer

        private void WriteToEventViewer(string msg)
        {
            using (EventLog eventLog = new EventLog("DSGService"))
            {
                eventLog.Source = "DSGService";
                eventLog.WriteEntry(msg, EventLogEntryType.Information, 101, 1);
            }
        }
    }```

1 Ответ

1 голос
/ 14 января 2020

Это, вероятно, результат исключения внутри метода TimerElapsed, который не позволяет перезапустить таймер. Чтобы избежать этого, вот что вы делаете:

  1. Установите свойство AutoReset вашего таймера на false.

  2. Внутри * Обработчик события 1012 * в предложении finally снова запускает таймер.

Это означает, что даже если в вашем обработчике события TimerElapsed возникла исключительная ситуация, таймер снова запустится .

...