2012-03-30 2 views
0

У меня проблема с двумя таймерами в службе Windows. Второй таймер TimerLimit никогда не выполняется. Я установил два таймера, потому что мне нужно, чтобы проверить, чтобы разобрать какую-то электронную почту, и мне нужно, чтобы она постоянно работала, а вторая, если что-то происходит после чтения электронных писем. У меня такое впечатление, что они в конфликте. Возможно ли, потому что первый таймер слишком быстр? любое предложение для решения этой проблемы? Спасибо заранееWindows Service speed

protected override void OnStart(string[] args) 
    { 
     stop = false; 
     ParseEmail.DeleteFiles(); 
     timer = new Timer(200); 
     timer.Elapsed += new ElapsedEventHandler(ExecuteService); 
     timer.Enabled = true; 
     timerLimit = new Timer(20000); 
     timerLimit.Elapsed += new ElapsedEventHandler(ExecuteServiceLimit); 
     timerLimit.Enabled = true; 
    } 

    protected override void OnStop() 
    { 
     stop = true; 
    } 

    private void ExecuteService(object source, ElapsedEventArgs e) 
    { 
     if (stop) 
     { 
      return; 
     } 
     try 
     { 
      if (ParseEmail.isNotUse) 
      { 
       ParseEmail.isNotUse = false; 
       ParseEmail.ParseValues(); 
      } 
     } 
     catch (Exception exp) 
     { 
      ParseEmail.isNotUse = true; 
      Console.WriteLine("Exception: {0}", exp.ToString()); 
     } 
    } 
    private void ExecuteServiceLimit(object source, ElapsedEventArgs e) 
    { 
     if (stop) 
     { 
      return; 
     } 
     try 
     { 
       ParseEmail.CheckLimitOrders(); 
     } 
     catch (Exception exp) 
     { 
      Console.WriteLine("Exception: {0}", exp.ToString()); 
     } 
    } 
} 

}

+0

Вам необходимо улучшить регистрацию ошибок. Console.WriteLine() не может работать в службе. Ваш код может умереть за исключение, и вы никогда не узнаете. Например, используйте EventLog. И остановите службу, чтобы не заполнить журнал с тысячами ошибок. –

ответ

0

Это действительно странно, что вы пишете. Попытайтесь увидеть загрузку процессора из диспетчера задач, и если она высока, вам нужно увеличить первый период таймера. Также проверьте, сколько времени занимает ParseEmail.ParseValues ​​().

Я вижу, что вы сбрасываете

ParseEmail.isNotUse = true; 

только тогда, когда у вас есть исключение, это правильно? Итак, вы запускаете эту функцию!

+0

Процессор нормальный не так высок. Да, только когда у меня есть исключение. –

0

Во-первых, ваши интервалы ужасно малы. Если это System.Timers.Timer, он находится в миллисекундах. 200 мс - 5 раз в секунду. Вам действительно нужно быстро выполнить эти задачи?

Во-вторых, что происходит в таймере 1? Поскольку интервал настолько мал, он срабатывает первым. Если это завершается навсегда, это может привести к зависанию всех ваших циклов процессора, предотвращая срабатывание таймера 2. (Скорее всего, но возможно.)

Кроме того, возможно, что ваш первый таймер выстреливает, прежде чем вы даже завершили настройку второго таймера.

Теперь, я считаю, вы используете System.Timers.Timer, основанный на конструкторе. Однако я скажу следующее: рассмотрите BackgroundWorker для обработки задач по отдельным потокам исполнения. Таким образом, никто не блокирует другой. Но ТОЛЬКО делайте это после того, как вы определили разумные времена стрельбы и что задействованные данные являются потокобезопасными и что вы не будете выделять сразу несколько потоков.

+0

Да, я использую System.Timers.timer. 200 миллисекунд было установлено, потому что я получаю электронные письма каждый момент, и мне нужно постоянно их анализировать. Эти электронные письма содержат торговый сигнал и ParseEmail.ParseValue() берет с них информацию и отправляет заказы на рынок. Второй таймер состоит в том, что, если что-то происходит во время выполнения, должна быть проверка, эта проверка выполняется вторым таймером. Теперь второй таймер никогда не выполняется. Я не очень разбираюсь в BackgroundWorker, возможно, вы так добры, чтобы опубликовать пример. большое вам спасибо за вашу помощь –