Таймер в C # windows service не перезапускается - PullRequest
1 голос
/ 08 октября 2010

У меня есть служба Windows, которая запускает четыре таймера для приложения мониторинга.Таймер, о котором идет речь, открывает веб-запрос, опрашивает оставшийся веб-сервис и сохраняет результаты в базе данных.

Пожалуйста, ознакомьтесь со следующим методом:

        void iSMSPollTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        iSMSPollTimer.Stop();
        try
        {
            Logger.Log("iSMSPollTimer elapsed - polling iSMS modem for new messages");
            string url = "http://...:../recvmsg?user=" + iSMSUser + "&passwd=" + iSMSPassword;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream resStream = response.GetResponseStream();

            XmlSerializer serializer = new XmlSerializer(typeof(Response));
            using (XmlReader reader = XmlReader.Create(resStream))
            {
                Response responseXml = (Response)serializer.Deserialize(reader);
                if (responseXml.MessageNotification != null)
                {
                    foreach (var messageWrapper in responseXml.MessageNotification)
                    {
                        DataContext dc = new DataContext();
                        DateTime monitorTimestamp = DateTime.Now;

                        if (messageWrapper.Message.ToUpper().EndsWith("..."))
                        {
                            //Saved to DB
                        }
                        else if (messageWrapper.Message.ToUpper().EndsWith("..."))
                        {
                            //Saved to DB
                        }
                        dc.SubmitChanges();
                    }
                }
                else
                {
                    Logger.Log("No messages waiting in the iSMS Modem");
                }
            }
            Logger.Log("iSMSPollTimer processing completed");
        }
        catch (Exception ex)
        {
            Logger.Log(GetExceptionLogMessage("iSMSPollTimer_Elapsed", ex));
            Logger.Debug(GetExceptionLogMessage("iSMSPollTimer_Elapsed", ex));
        }
        finally
        {
            iSMSPollTimer.Start();
        }
    }

Когда я смотрю нарегистрируя сообщения, я получаю сообщение «Обработка iSMSPollTimer завершена», и случайно после этого таймер не перезапускается.

Есть мысли?

Ответы [ 2 ]

2 голосов
/ 08 октября 2010

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

Я бы предложил вместо того, чтобы вызывать Timer.Stop и затем Timer.Start, установитьAutoReset свойство таймера до false при его создании.Это предотвратит любые проблемы повторного входа, потому что таймер автоматически останавливается при первом истечении интервала.

Ваш код обработчика остается тем же самым, за исключением того, что вы удаляете код, который вызывает iSMSPollTimer.Stop.

IЯ не говорю, что это наверняка решит вашу проблему, но устранит затянувшееся сомнение в проблеме повторного входа.

0 голосов
/ 16 июля 2012

Это довольно известная проблема с использованием таймеров в службе .NET.Люди скажут вам использовать другой тип таймера (Threading vs System), но, в конце концов, они вас тоже подведут.Как долго, прежде чем они перестают срабатывать?Чем короче ваш интервал, тем быстрее он потерпит неудачу.Если вы установите его на 1 секунду, вы увидите, что это происходит каждые пару часов.

Единственный обходной путь, который я нашел работающим для меня, не зависит от таймеров вообще и использует цикл while с функцией Sleep внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...