在高效的windows服务中安排循环任务的最佳方式

本文关键字:循环 任务 最佳 方式 高效 windows 服务 | 更新日期: 2023-09-27 18:07:30

我用。net Framework 4.0写了一个Windows Service,我需要在里面安排一个循环的任务。新任务只能在前一个任务完成后运行,因此没有并行任务…我所有的任务发生都在同一个对象(WCF通道工厂)上工作。一个任务几乎需要2秒才能完成,可以每2秒或每小时安排一次。我的限制是让这个Windows服务在内存和处理器使用上尽可能不可见/轻…

我已经找到了这两种方法:

  • 使用System.Timers.TimerAutoreset为false =>我不得不实现一个ElapsedEventHandler并传递我的共享对象(WCF)通道工厂)
  • 使用一个永不结束的循环:不确定mem/进程的使用

有什么建议吗?

谢谢你,祝你有美好的一天!

在高效的windows服务中安排循环任务的最佳方式

对我来说是很好的:我开始计时器一次,然后在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。