c# - Windows服务定时执行

标签 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 方法。

最佳答案

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

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

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

情况 2。 假设您想在 this.ExecuteTask() 完成后的接下来 5 分钟内执行该任务,使用Thread.Sleep()似乎更容易。同样,您也可以使用计时器来实现此行为,方法是每次重置计时器,同时计算每次 this.ExecuteTask() 的偏移量。完成。

注意1,对于情况1,在以下情况下应该非常小心:What if this.ExecuteTask()有时需要的时间超过该时间段(即,在上面的示例中,它从 12:05 开始,到 12:13 结束)。

  1. 这对您的申请意味着什么?将如何处理?

    a.完全失败 - 中止服务或在 12:10 中止当前(12:05)执行并启动 12:10 执行。
    b.没什么大不了的(跳过 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

关于c# - Windows服务定时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1102247/

相关文章:

c# - Asp.net 中的 JavaScript,C#

c# - Azure Application Insights HTTP 依赖项跟踪问题

c# - 批量获取函数结果

c# Windows 服务是否(可能)使用 app.config

c# - 从 HRESULT : 0x8004503A in Speechlib 获取异常

c# - .NET服务失败时,系统是否会记录异常?

c# - 如何从 3D 图像生成 2D 平面

c# - C# 中的延迟初始化 "proxy"

C# Windows 服务自终止服务

windows-services - 服务看门狗设计