2013-11-12 2 views
1

У меня есть эта простая служба Windows, которая является частью браузера. Он выполняет проверку базы данных и, если необходимо, обновляет некоторые строки. Эти действия занимают от 0,5 до 1 секунды.Служба Windows с таймером 25 секунд спустя

Данные, которые он читает, являются датой, указывающей, должен ли элемент обновляться.

Работает отлично, однако это всегда примерно на 25 секунд позже. Если я добавлю элемент в очередь, и этот элемент будет завершен в 15:00:00, служба обновит его в 15:00: 25ish.

Я пробовал использовать threading.timer, один поток и timers.timer, и все работает одинаково. Я также попытался остановить таймер во время прогона, хотя он занимает меньше секунды, поэтому это не должно быть проблемой.

Я также пытался подключить службу к отладчику, и то же самое происходит, ЕСЛИ я не поставил точку останова. Затем это происходит, как только он попадает в точку останова, и я нажимаю f5 для продолжения.

Может ли кто-нибудь пролить свет на то, почему служба, похоже, отстает? И возможное решение.

Я думал, что у меня закончилась нить, но у меня осталось много 1000, поэтому я немного пуст.

Пожалуйста, спросите, нужна ли вам дополнительная информация, поэтому я могу предоставить.

Я использую .net 4.0/C#

Threading.Thread

public partial class Service : ServiceBase 
{ 
    Thread thread; 

    public Service() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     thread = new Thread(DoWork); 
     thread.Start(); 
    } 

    private static void DoWork() 
    { 
     while (true) 
     { 
      //finish workingqueueitems 
      WorkingQueue.ProcessFinishedItems(); 

      Thread.Sleep(1000); 
     } 
    } 

    protected override void OnStop() 
    { 
     thread.Abort(); 
    } 
} 

Timers.Timer

public partial class Service : ServiceBase 
{ 
    System.Timers.Timer workingQueueTimer; 

    public Service() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     workingQueueTimer = new System.Timers.Timer(); 
     workingQueueTimer.Elapsed += new ElapsedEventHandler(workingQueueTimer_Elapsed); 
     workingQueueTimer.Interval = 1000; 
     workingQueueTimer.Enabled = true; 
    } 

    void workingQueueTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     workingQueueTimer.Enabled = false; 

     DoWork(); 

     workingQueueTimer.Enabled = true; 
    } 

    private static void DoWork() 
    { 
     //finish workingqueueitems 
     WorkingQueue.ProcessFinishedItems(); 
    } 

    protected override void OnStop() 
    { 
     workingQueueTimer.Stop(); 
     workingQueueTimer.Dispose(); 
    } 
} 
+0

«Я думал, что у меня закончилась нить, но у меня есть хорошая 1000 левых», где вы получили этот номер? –

+1

ваш код беспорядок. удалить инициализацию потока, while (true), Thread.sleep. ваш таймер опаздывает до завершения DoWork! – giammin

+0

-Scott: Я использовал ThreadPool.GetAvailableThreads(). -giammin: Как я уже сказал, мои знания ограничены. Не могли бы вы объяснить причины, почему мне это нужно? Таймеры. Попытка была испытанием, поскольку таймеры. Таймер вел себя медленно. Я обновлю код, чтобы он показывал оба примера. – Gucchi

ответ

0

Проблема может быть вызвана:

  • ваш DoWork() метод занимает 25 секунд, чтобы завершить
  • Вы видите данные DB кэшированных в каком-то или транзакции задерживая его
  • вашего метода WorkingQueue.ProcessFinishedItems() принимает неправильные строки для обновления
  • если ваша служба и db находятся в отдельно взятой машине, у них разные часы времени 25 сек.
+1

Я выяснил проблему сейчас :) База данных (и веб-сайты) находятся на другом сервере, а часы серверов на 26 секунд отстают от моего, а затем моя служба на моем компьютере-разработчике запускает его позже. Черт оконные часы! – Gucchi

+0

@ Gucchi: D Ваш код хорош, но используйте таймер один, он лучше, чем while (true) и thread.sleep – giammin

Смежные вопросы