Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows服务计划执行_C#_Windows Services - Fatal编程技术网

C# Windows服务计划执行

C# Windows服务计划执行,c#,windows-services,C#,Windows Services,如果我有一个Windows服务,需要每30秒执行一个任务,这是更好的使用;Timer()类或执行任务的循环会休眠几秒钟 class MessageReceiver { public MessageReceiver() { } public void CommencePolling() { while (true) { try { this.

如果我有一个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服务将创建MessageReceiver类的实例,并在新线程上执行CommenteColling方法。

在这十秒钟的等待期间,您还做了什么?使用Thread.sleep会阻止您执行其他操作。从性能的角度来看,我认为您不会看到太多的差异,但我会避免自己使用Thread.sleep


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

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


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

我想这些答案会有所帮助。

我没有回答,但是John Saunders(上图)。。。答案可以在这里找到

我想这取决于你的要求

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

但是,您也可以使用
Thread.Sleep()
实现此行为,方法是在线程唤醒和完成
this.ExecuteTask()
时计算偏移量

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

注意1,对于案例1,您在以下场景中应该非常小心:如果
此.ExecuteTask()
有时花费的时间超过时间段(即,在上面的示例中,它从12:05开始,到12:13结束)

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

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

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

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

    e。还有别的吗

  • 对于上面选择的策略,您选择的实现(计时器或
    Thread.Sleep()
    )是否容易支持您的策略


  • 注2。在.NET中可以使用几个计时器。请参阅以下文档(尽管有点过时,但这似乎是一个好的开始):

    看起来像的副本,我通过搜索“服务计时器”找到了它。@John谢谢。我尝试搜索“Windows服务计时器”,但找不到任何内容。干杯