Biinny Ответов: 1

Как использовать таймер только для запуска службы windows, как только timer_tick вызван, он должен работать как бесконечный цикл?


Здравствуйте Выродки,

Я хочу отправлять push-уведомления на устройства android и IOS через службу windows. Который имеет бесконечный цикл, отправляя уведомления одно за другим, и он делает паузу в течение 60 секунд между двумя уведомлениями. Уведомление на второе устройство зависит от ответа предыдущего устройства, поэтому я не могу использовать планировщик здесь.

Кроме того, хорошо ли использовать Thread.sleep(30000) для удержания петли в течение 30 секунд?

заранее спасибо.

Что я уже пробовал:

protected override void OnStart(string[] args)
        {

            TimerStartApp = new System.Timers.Timer();
            this.TimerStartApp.Interval = Convert.ToDouble(60000);
            this.TimerStartApp.Elapsed += new System.Timers.ElapsedEventHandler(this.TimerStartApp_Tick);
            TimerStartApp.AutoReset = false;
            TimerStartApp.Enabled = true;
            TimerStartApp.Start();
        }
..

private void TimerStartApp_Tick(object sender, ElapsedEventArgs e)
        {
                    
            this.TimerStartApp.Stop();
            this.TimerStartApp.Enabled = false;

            #region GCM Broker //Initializing gcmBroker

            #endregion

            #region APNS Broker //Initializing apnsBroker

            SendNotification();

            //WriteLog("TimerDelay_Tick() Executed");
            //this.TimerStartApp.Start();
        }

private void SendNotification()
        {

             while (true)
             {
               //Infinite loop
             }
        }

1 Ответов

Рейтинг:
10

Jochen Arndt

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

Воспользуйся Объекта waithandle.Метод WaitOne (Int32) (System.Нарезание резьбы)[^] для ожидания одного события (события остановки) или Объекта waithandle.Метод WaitAny (WaitHandle[], Int32) (System.Нарезание резьбы)[^] ждать нескольких событий. С помощью параметра timeout можно избежать с помощью таймера и вызов Sleep().

private static ManualResetEvent stopEvent = new ManualResetEvent(false);
private static Thread theThread;

protected override void OnStart(string[] args)
{
    theThread = new Thread(ThreadFunc);
    theThread.IsBackground = true;
    theThread.Start();
}

protected override void OnStop()
{
     stopEvent.Set();
     if (!theThread.Join(10000))
         theThread.Abort();
}

private static void ThreadFunc()
{
    int timeOut = startDelay;
    while (!stopEvent.WaitOne(timeOut))
    {
        // Send notifications

        // Set timeout value
        timeOut = 30000;
    }
}