【问题标题】:Windows service scheduled executionWindows 服务计划执行
【发布时间】:2009-07-09 07:01:08
【问题描述】:

如果我有一个需要每 30 秒执行一次任务的 Windows 服务,这更好用; 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 方法。

【问题讨论】:

  • 看起来是stackoverflow.com/questions/1099516/…的副本,我通过搜索“服务计时器”找到的。
  • @John 谢谢。我尝试搜索“Windows 服务计时器”,但找不到任何东西。干杯

标签: c# windows-services


【解决方案1】:

我认为这真的取决于您的要求。

案例 1. 假设您想从凌晨 12:00(即 12:00、12:05...)开始每五分钟运行一次this.ExecuteTask(),并假设this.ExecuteTask() 的执行时间不同(例如,从 30 秒到 2 秒) min),也许使用计时器而不是 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())。

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

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

    e。还有什么?

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

注2。您可以在 .NET 中使用多个计时器。请看以下文档(虽然有点陈旧,但似乎是一个好的开始):Comparing the Timer Classes in the .NET Framework Class Library

【讨论】:

    【解决方案2】:

    在这十秒钟的等待期间,你还在做其他事情吗?使用 Thread.sleep 会阻塞,阻止你做其他事情。从性能的角度来看,我认为您不会看到太大的差异,但我会避免自己使用 Thread.sleep。

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

    【讨论】:

      【解决方案3】:

      我相信这两种方法是等效的。无论哪种方式都会有一个线程:要么是因为您创建了一个,要么是因为实现 Timer 类的库创建了一个。

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

      【讨论】:

        【解决方案4】:

        我对@9​​87654321@ 的回答会有所帮助。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-06-01
            • 2011-02-18
            • 2016-02-10
            • 2010-09-28
            • 2011-10-11
            相关资源
            最近更新 更多