【发布时间】: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