Создайте .NET Threading.Timer с периодом Timeout.Infinite. - PullRequest
0 голосов
/ 08 октября 2018

Что я хочу, служба Windows, которая выполняет функцию с интервалом, без открытия нескольких потоков.

Что я сделал, используя Threading.Timer Я создал следующий код:

protected override void OnStart(string[] args) {
  System.Threading.Timer timer1 = new System.Threading.Timer(new TimerCallback(Risk), null, 60000, Timeout.Infinite);
}
public void Risk(object state) {
  try{
    //long operation
  }
  catch(ex){
  }
  finally{
    timer1.Change(1000, Timeout.Infinite);
  }
}

Моя проблема, похоже, этот код открывает несколько потоков.Это возможно?Где я неправ?Это хороший способ получить то, что я хочу?

ОБНОВЛЕНИЕ (с использованием System.Timers.Timer):

 protected override void OnStart(string[] args) {
    System.Timers.Timer aTimer;
    aTimer = new System.Timers.Timer(60000);
    aTimer.Elapsed += Risk;
    aTimer.AutoReset = true;
    aTimer.Enabled = true;
 }

 private void Risk(Object source, ElapsedEventArgs e) {
    aTimer.Enabled = false;
    try{}
    catch(ex){}
    finally{
      aTimer.Interval = 1000;
      aTimer.Enabled = true;
    }
 }

1 Ответ

0 голосов
/ 08 октября 2018

Несколько таймеров могут работать одновременно.Класс таймера не ожидает завершения тиков.(Я думаю, что у него должна быть такая функция, потому что это почти всегда то, что вы хотите.)

Простое решение - запустить цикл с Task.Delay:

while (!cancel) {
 DoStuff();
 await Task.Delay(...);
}

Task.Run(() => { AsyncCodeHere(); });.

...