Windows服务计划执行

时间:2009-07-09 07:01:08

标签: c# windows-services

如果我的Windows服务需要每30秒执行一次,最好使用; Timer()类或执行任务的循环然后休眠几秒钟?

class MessageReceiver 
{
    public MessageReceiver()
    {
    }

    public void CommencePolling()
    {
        while (true)
        {
            try 
            {
                this.ExecuteTask();     
                System.Threading.Thread.Sleep(30000);
            }
            catch (Exception)
            {
                // log the exception
            }
        }
    }

    public void ExecutedTask()
    {
        // do stuff
    }
}

class MessageReceiver 
{
    public MessageReceiver()
    {
    }

    public void CommencePolling()
    {
        var timer = new Timer()
            {
                AutoReset = true,
                Interval = 30000,
                Enabled = true
            };

        timer.Elapsed += Timer_Tick;    
    }

    public void Timer_Tick(object sender, ElapsedEventArgs args)
    {
        try 
        {
            // do stuff
        }
        catch (Exception)
        {
            // log the exception
        }
    }
}

Windows服务将创建MessageReciever类的实例,并在新线程上执行CommencePolling方法。

5 个答案:

答案 0 :(得分:4)

我认为这实际上取决于您的要求。

案例1。 假设您想要从上午12:00开始每隔五分钟运行一次this.ExecuteTask()(即,12:00,12:05,...),并假设this.ExecuteTask()的执行时间不同(例如,来自30秒到2分钟),也许使用计时器而不是Thread.Sleep()似乎是一种更简单的方法(至少对我而言)。

但是,您可以使用Thread.Sleep()来实现此行为,同时通过计算线程唤醒时和this.ExecuteTask()完成时的时间戳来计算偏移量。

案例2。 假设您想在完成this.ExecuteTask()后的5分钟内执行任务,使用Thread.Sleep()似乎更容易。同样,您可以通过计时器以及每次this.ExecuteTask()完成时计算偏移量时每次重置计时器来实现此行为。

注1 ,对于案例1,您应该在以下场景中非常小心:如果this.ExecuteTask()有时需要超过期限(即从12:05开始并完成),该怎么办?上例中的12:13)。

  1. 这对您的应用程序意味着什么以及如何处理?

    一个。完全失败 - 中止服务或在12:10中止当前(12:05)并执行12:10执行。
    湾没什么大不了的(跳过12:10并在12:15运行this.ExecuteTask())。

    ℃。没什么大不了的,但需要在12:05任务完成后立即执行12:10执行(如果它持续超过5分钟怎么办?)。

    d。即使当前正在执行12:05执行,也需要启动12:10执行。

    即其他什么?

  2. 对于您在上面选择的政策,您选择的实施(计时器或Thread.Sleep())是否易于支持您的政策?

  3. <强>注2 即可。您可以在.NET中使用多个计时器。请参阅以下文档(即使它有点老化,但似乎是一个好的开始):Comparing the Timer Classes in the .NET Framework Class Library

答案 1 :(得分:0)

你在十秒钟的等待期间还在做什么吗?使用Thread.sleep会阻止,阻止你做其他事情。从性能的角度来看,我认为你没有看到太大的区别,但我会避免自己使用Thread.sleep。

有三个计时器可供选择 - System.Windows.Forms.Timer在主线程上实现,而System.Timers.Timer和System.Threading.Timer正在创建单独的线程。

答案 2 :(得分:0)

我相信这两种方法都是等价的。将有一个线程:要么是因为你创建了一个,要么是因为实现Timer类的库创建了一个。

使用Timer类可能在资源方面稍微便宜一些,因为实现计时器的线程也可能监视其他超时。

答案 3 :(得分:0)

我知道this question的答案会有所帮助。

答案 4 :(得分:0)

我没有回答,但约翰桑德斯(上图)......答案可以在这里找到For a windows service, which is better, a wait-spin or a timer?