2009-07-09 175 views
2

如果我有一个Windows服务需要每30秒执行一次任务,这是更好使用; Timer()类或执行任务的循环会休眠几秒钟?Windows服务计划执行

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

+2

看起来像http://stackoverflow.com/questions/1099516/for-a-windows-service - 这是一个更好的等待旋转或一个定时器,我发现通过搜索“服务计时器”。 – 2009-07-09 07:11:22

回答

4

发现我认为这真的取决于你的需求。

情况1. 假设你想运行从12:00 AM this.ExecuteTask()每五分钟开始(即,12:00,12:05,...),并假设的this.ExecuteTask()的执行时间变化(例如,从30秒到2分钟),也许使用timer而不是Thread.Sleep()似乎是一个更简单的方法(至少对我来说)。

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

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

注1,为1的情况下,你应该在以下情况下非常小心:如果什么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

0

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

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

0

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

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