【问题标题】:Create a .NET Threading.Timer with a period Timeout.Infinite创建一个带有 Timeout.Infinite 周期的 .NET Threading.Timer
【发布时间】:2018-10-08 14:08:01
【问题描述】:

我想要的是一个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;
    }
 }

【问题讨论】:

  • 请阅读 MSDN 中关于 System.Threading.Timer 的文档。明确规定回调方法必须是可重入的,可以同时调用多次。
  • 修复:在计时器回调开始时禁用时间,然后在回调结束时重新启用。
  • 为什么不使用 thread.sleep 无限?
  • @MatthewWatson 这还不够,因为可以将多个滴答声排入队列或同时执行同一行。

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


【解决方案1】:

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

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

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

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

【讨论】:

猜你喜欢
  • 2018-02-11
  • 2019-02-19
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多