创建一个带有周期Timeout.Infinite的.NET Threading.Timer

时间:2018-10-08 14:08:01

标签: c# .net timer windows-services cthreads

我想要的是一种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 :(得分:1)

多个计时器刻度可以同时运行。计时器类不等待刻度完成。 (我认为它应该具有这样的功能,因为它几乎总是您想要的。)

一个简单的解决方法是使用Task.Delay运行循环:

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

然后您以Task.Run(() => { AsyncCodeHere(); });开始。