在高效的windows服务中安排循环任务的最佳方式
本文关键字:循环 任务 最佳 方式 高效 windows 服务 | 更新日期: 2023-09-27 18:07:30
我用。net Framework 4.0写了一个Windows Service,我需要在里面安排一个循环的任务。新任务只能在前一个任务完成后运行,因此没有并行任务…我所有的任务发生都在同一个对象(WCF通道工厂)上工作。一个任务几乎需要2秒才能完成,可以每2秒或每小时安排一次。我的限制是让这个Windows服务在内存和处理器使用上尽可能不可见/轻…
我已经找到了这两种方法:
- 使用
System.Timers.Timer
与Autoreset
为false =>我不得不实现一个ElapsedEventHandler
并传递我的共享对象(WCF)通道工厂) - 使用一个永不结束的循环:不确定mem/进程的使用
有什么建议吗?
谢谢你,祝你有美好的一天!对我来说是很好的:我开始计时器一次,然后在Tick方法中我将安排下一个Tick调用。这样的:
private Timer _timer;
//Interval in milliseconds
int _interval = 1000;
public void SetTimer()
{
// this is System.Threading.Timer, of course
_timer = new Timer(Tick, null, _interval, Timeout.Infinite);
}
private void Tick(object state)
{
try
{
// Put your code in here
}
finally
{
_timer?.Change(_interval, Timeout.Infinite);
}
}
// dont forget to dispose your timer using await _timer.DisposeAsync(); or _timer.Dispose();
System.Timers.Timer
是可行的方法,对系统性能几乎没有影响。当前的系统可以处理数千个计时器。
因为你想让计时器继续,所以不要设置AutoReset,但你需要一种方法来改变它的间隔(如果你需要的话)。
你的服务实例应该包含一个WCF通道工厂的实例。
为了确保同步处理,您应该实现一个Interlocked
保护标志,就像一个long,它可以作为繁忙的指示器。例如,如果等于1,则从计时器经过的事件开始处理的方法将简单地返回。一旦处理完成,此时将标志设置为零,进一步的计时器经过的事件将能够进入并再次启动处理。
记住在各种服务事件中停止、重新启动和处置计时器,如pause、stop、start。